此文章是我在自己寫代碼時,每次結合使用不同的輸入方法時,老是遇到各種奇奇怪怪的問題,得不到自己想要的輸出結果,查閱了各種資料之後,總結如下:
cin
的讀取字元規則:
cin
遇到回車、空格、tab鍵 結束,但是緩沖區還存在這三個字元,并沒有将這三個字元丢棄,且指針光标在這三個字元之前,也就是說,下一次通過其他輸入函數讀取時,是可以讀到這三個字元的。
cin.get
的讀取字元規則:
- 讀取字元:
以Enter鍵結束,并且會将Enter鍵作為一個字元讀入,讀完Enter鍵之後,指針光标移到Enter鍵後面,如果後面還有輸入的話,會讀取下一字元。故下圖不會像後面讀取字元串一樣介紹的不跳過Enter鍵
int main()
{
int len=0;
cin>>len;
int j=0;
// cin.ignore();
while(len)
{
cout<<"len:"<<len<<endl;
char str[100];
cin.get(str[j]);
// cin.ignore();
cout<<"str:"<<int(str[j])<<'\t';
j++;
len--;
}
return 0;
}
如下所示,使用 cin.ignore
将回車符丢棄,程式便能夠正常運作。
- 讀取字元串:
以Enter鍵結束,讀取到前面殘留的回車會直接結束,并且指針光标不會跳過Enter鍵,當輸入之後,再次使用
3【回車】
,然後想輸入
cin.get
4【回車】
是讀取不到該輸入值的
但是你不用輸入,程式會直接結束,因為前一個輸入的回車并沒有舍棄,而是在緩沖區,這時讀取到的是緩沖區的回車而直接結束。
以下是不使用
cin.ignore
丢棄緩沖區的字元的結果:
指針光标不跳過Enter鍵:注釋掉之後,可以看到程式隻輸入
cin.ignore
,就直接結束了,而且輸入了5個空串,後面的輸入語句看似沒有執行,其實執行了,讀取的是緩沖區中遺留下的Enter鍵,并且
5【回車】
函數遇到回車不會将指針光标移到回車後,故造成了讀到的一直是回車,是以結束
cin.get
和
cin.getline
函數類似,所不同的是,
cin.get
遇到回車會将指針光标後移,具體看後面
cin.getline
cin.getline
的貼圖。
(
的作用預設是丢棄緩沖區的一個字元)。
cin.ignore
我們可以看到之後,回車了,而且後面也有
cin>>len
要求輸入,但是程式卻直接自動執行結束,說明讀取字元串時,指針光标不會跳過Enter鍵,除非人為添加
cin.get
或者
cin.ignore()
讀走Enter鍵,程式才能正常運作.
getchar()
int main()
{
int len=0;
cin>>len;
int j=0;
// cin.ignore();
while(len)
{
cout<<"len:"<<len<<endl;
char str[100];
cin.get(str,100);
// cin.ignore();
cout<<"str:"<<str<<'\t';
j++;
len--;
}
return 0;
}
如下所示,使用 cin.ignore
将回車符丢棄,程式便能夠正常運作。
cin.getline
的讀取字元規則:
- 讀取字元串:Enter鍵結束
當讀到Enter鍵的時候,此次讀取結束,會将指針光标移到Enter鍵之後,進而下一次讀取的是Enter鍵之後的字元。
int main()
{
int len=0;
cin>>len;
int j=0;
cin.ignore();
while(len)
{
cout<<"len:"<<len<<endl;
char str[100];
cin.getline(str,100);
// cin.ignore();
cout<<"str:"<<str<<'\t';
j++;
len--;
}
return 0;
}
當我們輸入後,使用
2【回車】
丢棄了回車符,是以再輸入
cin.ignore
時,直接讀取12,指針光标移到回車之後,而第二次讀取時,讀取的是我們輸入的23,而不是12的Enter鍵。
12【回車】
如果我們注釋掉第一個之後,可以看到,我們輸入
cin.ignore
後,
2【回車】
讀取了2,然後
len
遇到前面緩沖區留下的Enter鍵,結束此次讀取操作,并将指針光标移動至回車之後,然後執行下一次讀取操作,我們輸入23,可以看到第二次讀取到了23這個字元串。
cin.getline