在cin后getline所遇到的问题

在cin后getline所遇到的问题

在C++中,使用cin读取数据后,再使用getline读字符串,就会遇到buffer没有清空的问题,具体如下

#include<iostream>
#include<string>
using namespace std;

void main()
{
    int value;
    cin >> value;
    std::vector<std::string> text;

    for (int i = 0; i < value; i++)
    {
        string s;
        getline(cin, s);
        text.push_back(s);
    }
    for (auto &it : text)
    {
        cout << it << endl;
    }
}

输入
//3
//abc
//ab
输出
//
//abc
//ab

即本来还需要读入3行字符串,却只读了1行。

为什么?

仔细发现,是text的第一个元素是空字符串,而不是我们想要的abc.

其实这里是个new line ,即\n或者是一个endl

原因是我们在

cin>>value;

我们这里做的操作是

  1. 键盘输入2
  2. 然后敲了个enter回车.

所以此时缓冲区的队列内容应该是

输入2输入enter
2endl

于是在下面执行getline时,由于检查到缓冲区还有数据,会把endl读出来。

解放办法

  1. 在cin后,根据需要多调用一次getline,清空缓冲区。

    
    #include<iostream>
    
    
    #include<string>
    
    using namespace std;
    
    void main()
    {
       int value;
       cin >> value;
       string strtmp;
       getline(cin, strtmp); //strtmp 只是把缓存区清空,沒有其他的作用
       std::vector<std::string> text;
    for (int i = 0; i < value; i++)
    {
        string s;
        getline(cin, s);
        text.push_back(s);
    }
       for (auto &it : text)
    {
        cout << it << endl;
    }
    }
  2. 调用cin.ignore()把缓冲区清空。

    
    #include<iostream>
    
    
    #include<string>
    
    using namespace std;
    
    void main()
    {
        int value;
        cin >> value;
        cin.ignore();       //调用默认ignore()
        std::vector<std::string> text;
    
    for (int i = 0; i < value; i++)
    {
        string s;
        getline(cin, s);
        text.push_back(s);
    }
       for (auto &it : text)
    {
        cout << it << endl;
    }
    }

    上次调用的cin.ignore()默认版本,它的完整流程如下:

    清空缓冲区直到遇到以下条件之一:

    1. 清空1个字符。
    2. 读到endl。

    对于情况多字符,于是可以使用cin.ignore(1000,'\n')

    这句话表示ignore满足下面条件之一就会停止:

    1. 参数1指ignore清空 1000个字符;
    2. 参数2要求ignore清空直到遇到\n(换行标志)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值