在使用getline讀入一整行時,若是前面是使用getchar()、cin這類讀入了一個字母,但是不會讀入后續換行\n符號或者空格的輸入時,再接getline()就容易出現問題。
這是因為輸入數字之后,敲回車,產生的換行符仍然滯留在輸入流了,接着就被getline(cin,s)給讀進去了,此時的s=“\n”,所以實際上s只是讀入了一個換行符\n。
而若是前面使用getline(),再又用getline()進行讀入,此時不會發生問題。getline()中讀入結束的回車后,結束符不放入緩存區,會將讀入的\n直接去除,下一個輸入前,緩沖區為空,並不會因為回車留下\n。而cin的結束后,以及getchar()此類的讀入結束后,按下回車或者使用空格讀入下一個,此時按下的回車或空格會還在緩存區,繼續用getline()就會出現前面所提到的情況。
string s; string test1; char test2; cin>>test1; // test2=getchar(); // getline(cin,test1); getline(cin,s); cout<<test1<<endl; cout<<s;
先用cin再用getline():
使用getchar()再用getline():
使用getline()再getline()不會出問題:
那么如何解決前面用了cin、getchar()后的輸入呢?可以直接在cin和getchar()后使用一個getchar()吃掉接下來的換行
比如:
string s; string test1; char test2; cin>>test1; getchar(); getline(cin,s); cout<<test1<<endl; cout<<s;
這樣輸入就正常了,getchar()將接下來的空格或回車吃入但不保存,這樣繼續進行getline()即可。
輸入abc空格abc:
輸入abc換行def: