cin cin.get() cin.getline() 2017年7月2日學習記錄

時間:2017年7月2日
1.

#include <iostream>
#include <cstring>

sizeof(name);//用於計算整個數組的長度
strlen(name);//返回的是儲存在數組中的字符串的長度,而不是數組半身的長度。

2.
cin使用空白(空格、製表符和換行符)來確定字符串的結束位置,這意味着cin在讀取有多個單詞組成的句子時,往往只讀取第一個空白前的單詞就停止讀取,並在讀取的單詞後添加空字符。

爲了解決這個問題,istream中的類(如cin)提供了一些面向行的類成員函數,getline()和get()。着兩個函數都能讀取一行的輸入,直到到達換行符。
但是,getline()將丟棄換行符,而get()將換行符保留在輸入序列中。

示例代碼:1.1

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char namea[20];
    char nameb[20];
    cout<<"此次輸入將用get()函數讀取。"<<endl;
    cin.get(nameb,20);
    cout<<nameb<<endl;
    cout<<"此次輸入將用getline()函數讀取。"<<endl;
    cin.getline(namea,20);
    cout<<namea<<endl;
    return 0;
}

運行結果:
這裏寫圖片描述
將函數前後調換

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char namea[20];
    char nameb[20];
    cout<<"此次輸入將用getline()函數讀取。"<<endl;
    cin.getline(namea,20);
    cout<<namea<<endl;
    cout<<"此次輸入將用get()函數讀取。"<<endl;
    cin.get(nameb,20);
    cout<<nameb<<endl;
    return 0;
}

運行結果
這裏寫圖片描述

可以看到當用get()函數作爲第一次讀取函數時,函數讀取了“asd asd”,而程序運行到使用getline()時,直接跳過了用戶輸入,打印了換行符。因爲get()函數只讀取到換行符就停止讀取,並將換行符繼續留在輸入隊列中,程序運行到getline()時,因爲換行符繼續留在輸入隊列中,所以getline()先讀取換行符,而換行符作爲getline()結束的標誌,使得用戶就無法繼續輸入。
而第一次使用getline()時,函數一樣讀取了“asd ads”,並以換行符作爲結束,但getline()丟棄了換行符,這樣就當程序運行到get()時,用戶就能繼續輸入。

解決辦法
我們可以同個連續調用兩次get()函數,使用戶能繼續輸入

    cout<<"此次輸入將用get()函數讀取。"<<endl;
    cin.get(nameb,20).get();
    cout<<nameb<<endl;

總結:
在C++ Primer Plus (第六版) p-81頁中指出,get()使輸入更仔細。例如,假設用get()將一行讀入數組中。如何知道停止讀取的原因使猶豫已經讀取了整行,而不是由於數組已經填滿呢?答案是查看下一個輸入字符(get()將換行符保留在輸入隊列中),如果使換行符,說明已讀取了整行;否則,說明該行中還有其他輸入。在第17章將介紹這種技術。總之,getline()使用起來簡單一些,但get()使得檢查錯誤更簡單些。
可以用其中的任何一個來讀取一行輸入;只是應該知道,它們的行爲稍有不同。

C++ Primer Plus (第六版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章