C++中关于 getline() 读取缓冲区中回车,以及cin 结束符的问题

废话不多说直接上代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str1;
    int x;cin>>x;
    while(x--){
        getline(cin,str1);
        cout<<str1<<"\n";
    }
    return 0;
}

输入“2” “回车” “asd”

运行结果是这样的:

可以看出当我输入2后按下回车,向下又自动跳了一行,也就是第一行和第三行之间空出来一行。然后输入“asd“输出asd,然后结束。

然后就发现一个问题,明明我输入的2应该输入两次,为什么输入完一次就over了呢?为什么多出来一行空格呢?

仔细查看上面的输入输出,运行结果可以看到 当我输入 2 之后自动的换了一次行,也就是str1已经输出了但是为空。

然后我又换了一种输入方式,又输入了一次,输入为“2 haha”   "回车"   “asd”运行结果如下:

所以得出结论cin>>的结束符,回车,或者空格都可以,但是当cin读取结束后,cin的结束符还会再缓冲区中存在,并让下次需要读取时进行读取

就拿第二次运行来说,当我输入2后有一个空格,缓冲区从2开始读取读取到空格后结束,但是空格并不做处理,留在缓冲区中做下一次使用,所以就造成了str1为“ haha”(haha前面有个空格),

所以可以看出cin与getline()的区别:

               getline()中的结束符,结束后,结束符不放入缓存区;

               cin的结束符,结束后,结束符还在缓存区;

所以在使用 cin 后若要使用 getline() 必须要把前面cin遗留的结束符处理掉,解决方法为:在使用getline()之前,加入一行getline()来处理cin留下的结束符;代码如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str1;
    int x;cin>>x;
    getline(cin,str1);
    while(x--){
        getline(cin,str1);
        cout<<str1<<"\n";
    }
    return 0;
}

运行结果:

完美~~~

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值