有時候,我們在使用cin時 可能會遇到想要輸入的字串中,包含空白、換行、tab
但是這會造成讀取資料與顯示時,會有不完全存取。
cin 不會將換行字元 空白 tab鍵 讀入 這些空白都是拿來作為字串結束
前言
有時候,我們在使用cin時 可能會遇到想要輸入的字串中,包含空白、換行、tab
但是這會造成讀取資料與顯示時,會有不完全存取。
cin 不會將換行字元 空白 tab鍵 讀入 這些空白都是拿來作為字串結束
接下來,讓我們看看下列範例:
cin範例
所以假設今天創了一個陣列 要讀入一行有空白間隔的字
char charry1[20];
cin >> charry1;
cout << charry1 << endl;
input : hello C++
會印出 hello
那"C++"這串字會在哪?
讓我們在往下看
char charry1[20];
char charry2[20];
cin >> charry1;
cout << charry1 << endl;
cin >> charry2 ;
cout << charry2 << endl;
同上 input: hello C++
會印出:
hello
C++
其實剩下的"C++"這串字存到cin的buffer裡
所以當遇到 cin >> charry2 ; 這串code時(循序點)
會把之前存放在buffer的值放到charry2 所以才會出現這個結果
那麼要如何改善 空白的問題
有兩個方法:
解決方法:
getline() 和 get()
而這裡個func的差別在哪? 兩者都會讀入空白,不過:
getline() => 不會將換行字元視為輸入值加以儲存
get() => 則會將換行字元視為輸入資料
1.使用getline
char name[10];
cout << "enter your name :";
cin.getline(name,10); //呼叫函數 ,10代表最大能讀入的字串長度
input : jason <ENTER>
則讀入ENTER鍵時 會產生換行字元 並將他取代成null => |j|a|s|o|n|\0| | |..
2.使用get
char name[10];
char id[10];
cout << "enter your name :";
cin.get(name,10); //呼叫函數 10 是最大能讀入的字串長度
cin.get(id,10);
cout << "name :"<< name << endl;
cout << "id :"<< id << endl;
input :
enter your name : jason<ENTER>
則會看到:
name : jason
id :
因為get() 會將換行字元讀入 所以在ENTER按下後 前面的字串會放置程式的變數中
可是換行字元卻會被留在buffer中 等待下一次輸入時 讀入,因此就會被下一個cin.get吃進去
那要如何解決?
只要:
cin.get(name,10);
cin.get();
cin.get(id,10);
如此便可搞定
再來還有另一種方式表示:
直接下
cin.get(name,10).get();
這代表會回傳cin物件 然後以此物件再用作get函數的引數傳入
參考資料
<參考C++ primer plus 5/e>
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝