C++讀取字符串 cin、getline()、get() 等輸入可能遇到的問題和解決辦法

 

1.字符串輸入

問題:cin如何確定我們完成了字符串的輸入呢?

答:cin會使用空白(空格、製表符、換行符)來確定字符串的結束位置,

這就意味着cin在獲取字符數組輸入時,只讀取一個單詞,將該字符串放入數組中,並自動在末尾添加空字符。

如 :

cout<<"Enter your name:\n";
cin>>name;
cout<<"Enter your favorite fruit:\n";
cin>>fruit;
cout<<"I have some "<<fruit<<"for you,"<<name<<".\n";

當我們在輸入名字,如 Taylor Swift 時,我們便失去了輸入水果的機會,系統會直接輸出

I have some Swift for you,Taylor.

那麼我們如何來讀取一個完整的字符串呢?

 

2.每次讀取一行字符串輸入

istream類中提供了一些面向行的類成員函數:getline() 和 get()

這兩個函數都讀取一行輸入,直到到達換行符。然而,getline() 將丟棄換行符,而 get() 將換行符保留在輸入序列中。

  • getline()

getline() 函數讀取整行,通過回車鍵輸入的換行符來確定輸入結尾。

要調用這種方法,可以使用cin.getline()。

該函數有兩個參數,第一個參數是用來存儲輸入行的數組的名稱,第二個參數是要讀取的字符數。(若該參數爲20,則函數最多讀取19個字符,餘下的空間用於存儲自動在結尾添加的空字符)

getline() 在讀取指定數目的字符或遇到換行符時停止讀取。

如:(把一行讀入到name數組中,當這行包含字符不超過19個時)

cin.getline(name,20);
  • get()

與getline() 類似,但get並不再讀取並丟棄換行符,而是將其保留。

使用 get() 可能會出現下面的問題

cin.get(name,20);
cin.get(fruit,20); //無法執行

原因在於,第一次調用get()後,換行符保留在輸入隊列中,因此第二次調用時看到的第一個字符便是換行符。

因此 get() 認爲已經到達行尾,而沒有發現任何可讀取的內容。

那麼我們可以用不帶任何參數的  cin.get() 調用可讀取下一個字符(即使是換行符)。也就是說可執行:

cin.get(name,20);
cin.get();        //讀取換行符
cin.get(fruit,20);

另一種方式是,將兩個類成員函數拼接起來,如下:

cin.get(name,20).get();

之所以可以這樣做是因爲 cin.get(name,20) 返回一個cin對象,該對象隨後將被用來調用get()函數。

同樣,下面的語句將把輸入中的連續兩行分別讀入到數組name1 和name2中,效果與兩次調用cin.getline()相同。

cin.getline(name1,20).getline(name2,20);

編程中往往使用 get() 比較多,原因是 get()輸入可以知道停止讀取的原因是 由於已經讀取了整行,還是 由於數組已經填滿.。

我們可以查看下一個輸入字符,若是換行符,則說明已經讀取了整行,否則,說明該行中還有其他輸入。

總之,getline() 使用起來更簡單,但 get() 使得我們檢查錯誤更簡單。


3. 當 getline() 或 get() 讀取空行時會出現什麼情況呢?

舉個例子:

cout<<" what year was your house built?\n";
cin>>year;
cout<<" what is its street address?\n"
cin.getline(address,80);

當我們運行該程序時會發現,我們根本沒有輸入地址的機會。

這是因爲cin 在讀取年份時,將回車鍵生成的換行符留在了輸入隊列中,後面的cin.getline()看到換行符,認爲是一個空行,

並將該空字符串賦給address數組。

解決辦法:

cout<<" what year was your house built?\n";
cin>>year;
cin.get();
cout<<" what is its street address?\n"
cin.getline(address,80);

或( cin>>year ).get();

 

總結:

在我們編程時,遇到輸入被阻斷的問題,就要查看cin在讀取輸入字符串時是否遇到了 換行、空行,我們就需要採取相應的措施來解決。

 

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