問題1:cin如何確定已完成字符串的輸入?
由於不能通過鍵盤輸入空字符,因此cin使用空白(空格,制表符和換行符)來確定字符串的結束位置;
這意味着cin在獲取字符數組輸入時只讀取一個單詞,讀取該單詞后,cin將字符串放在數組中,並自動在結尾添加空字符串;
例:
#include <iostream>
int main()
{
using namespace std;
const int Size=20;
char name[Size];
char things[Size];
cout<<"Enter your name:\n";
cin>>name;
cout<<"Enter the name of your favorite things:\n";
cin>>things;
cout<<things<<endl<<name<<endl;
return 0;
}
輸出:
無空格時輸出正常:
有空格時輸出異常:
剛打完name后回車就直接出結果了,如下圖:
問題2:
我設置的數組長度為
const int Size=20;
如果cin時輸入的字符長度長於20,則也會有異常:
解決方案:
面向行的輸入
getline()與get(),這兩個函數都是讀取一行輸入,直到到達換行符;
但隨后getline()將丟棄換行符,而get()將換行符保留在輸入序列中;
1)getline()通過回車輸入的換行符確定輸入結尾,
調用方法:cin.getline(xxx,xxx);等
getline(cin,xxx,xxx);等
具體MSDN;
本例中,cin.getline(name,20);//最多讀取19個字符,最后余下空間用於自動存儲結尾處的空字符;
getline()成員函數在讀取指定的字符數目或遇到換行符停止讀取,並用空字符替換換行符;
2)get()函數
該函數有幾個變體,其中一個變體的工作方式與getline()類似,接受參數相同,解釋參數也相同,並且都讀到結尾;
但不再讀取並丟棄換行符了,而將其留在輸入隊列中;
所以連續兩次的讀取將會出現問題;
解決方法:后面使用不帶參數的get()可讀取下一個字符(即使是換行符)
第10行代碼后插入一行加上cin.get();
或合並寫法 第10行改為 cin.get(name,Size).get();均可。
當getline()或get()讀取空行后,get()(不是getline())將設置失效位置(failbit);接下來的輸入被阻斷,恢復用:cin.clear();
但輸入字符串比分配空間長,則getline()與get()會將余下的字符留在輸入隊列中;
getline()遇到換行符后,會認為是一個空行,並將一個空字符串賦值給目標;解決的辦法是先讀取換行符並丟棄,包括get()函數;
例:cin>>year;
cin.get();//或等同於 (cin>>year).get();