[C++] cin空白與換行輸入處理

前言


有時候,我們在使用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>

有关编译器优化的更完整信息,请参阅优化通知
标签: