C++中,初學時最常用的輸入字符的方式為cin,但是,cin是如何確定已經完成了字符串的輸入了呢?由於不能通過鍵盤輸入空字符("\0"),因此cin需要用別的方法來確定字符串的結尾位置。cin使用空白(空格,制表符和換行符)來確定字符串結束的位置,這意味着cin在取字符數組輸入時只能讀取一個單詞。讀取該單詞后,cin將該字符串放到數組中,並自動在結尾添加空字符。如下的程序所示:
#include<iostream> using namespace std; int main() { const int size = 20; char name[size]; char desert[size]; cout << "請輸入你的名字:\n"; cin >> name; cin.get(); cout << "請輸入你最喜歡的甜食:\n"; cin >> desert; cin.get(); cout << "I have some delicious " << desert << " for you," << " . \n"; cin.get(); return 0; }
程序運行結果:
請輸入你的名字:
xiao ming
請輸入你最喜歡的甜食:
I have some delicious ming for you, .
你看,上圖中的運行程序,我還沒有對我最喜歡的甜食輸入呢,程序就迫不及待的顯示了下面的內容。這是因為:cin把xiao作為了第一個字符串,並把它放入了name數組中,把ming這個字符串留在了輸入隊列中。當cin在輸入隊列中搜索用戶喜歡的甜點時,它發現了ming,因此它讀取ming,並把它放入了dessert數組中。
那么,如何輸入一行的字符串呢?
一、面向行的輸入:getline()與get()
1. getline()
getline()函數用於讀取整行,它使用通過回車鍵鍵入的換行符來確定輸入結尾。該函數有兩個參數,第一個參數是用來存儲輸入行的數組的名稱,第二個參數是要讀取的字符數。如下面的代碼所示就能避免只讀取一個單詞的錯誤:
#include<iostream> using namespace std; int main() { const int size = 20; char name[size]; char dessert[size]; cout << "請輸入你的名字:\n"; cin.getline(name, size); cout << "請輸入你最喜歡的甜食:\n"; cin.getline(dessert, size); cout << "I have some delicious " << dessert << " for you.\n" ; cin.get(); return 0; }
程序運行結果:
請輸入你的名字: xiao ming 請輸入你最喜歡的甜食: ice cream I have some delicious ice cream for you.
getline()函數每次讀取一行,它通過換行符來確定行尾,但不保存換行符。相反,在存儲字符串時,他用空字符來替換換行符。
2.get()
get的用法和getline()函數一樣。但是,get()函數會保存換行符。先看個例子:
cin.get(name,size);
cin.get(name,size);
就是連續調用了兩次get(),由於第一次調用后,換行符將保留在輸入隊列中,因此,第二次調用時看到的第一個字符便是換行符,因此get()認為以到達結尾,而沒有發現任何可讀取的內容。
那么,如何解決這種問題呢?有以下兩種方式:
(1)
cin.get(name,size);
cin.get(); // 使用不帶任何參數的get()可讀取下一個字符(即使是換行符),因此,可通過它來處理換行符,為讀取下一行輸 入做好准備
cin.get(name,size);
(2)cin.get(name,size).get()
程序如下所示:
#include<iostream> using namespace std; int main() { const int size = 20; char name[size]; char dessert[size]; cout << "請輸入你的名字:\n"; cin.get(name, size).get(); cout << "請輸入你最喜歡的甜食:\n"; cin.get(dessert, size).get(); cout << "I have some delicious " << dessert << " for you.\n" ; cin.get(); return 0; }
運行結果:
請輸入你的名字: xiao ming 請輸入你最喜歡的甜食: ice cream I have some delicious ice cream for you.
