時間: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 (第六版)