getline()的使用注意

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

 

 

 

posted @ 2020-03-21 19:59  zzzlight  阅读(3625)  评论(0编辑  收藏  举报