天天看點

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() 函數讀取整行,通過Enter鍵輸入的換行符來确定輸入結尾。

要調用這種方法,可以使用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 在讀取年份時,将Enter鍵生成的換行符留在了輸入隊列中,後面的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在讀取輸入字元串時是否遇到了 換行、空行,我們就需要采取相應的措施來解決。

繼續閱讀