在使用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: