【问题标题】:buffer cleaning in getline functiongetline 函数中的缓冲区清理
【发布时间】:2021-06-12 08:42:26
【问题描述】:

我知道 cin.getline() 函数不会清理缓冲区,例如在程序下面的代码中跳过第 4 行:

char name[10];
char id[10];
std::cin >> name;
std::cin.getline(id,10);
std::cout << name << std::endl;
std::cout << id << std::endl;

输出(如果我输入“Meysam”作为名称变量):

Meysam

所以因为 cin.getline() 没有清理缓冲区,所以我们不能输入 id 变量,但是如果我们使用两个 cin.getline() 如下所示,我们可以输入名称和 id 变量。

char name[10];
char id[10];
std::cin.getline(name,10,'\n');
std::cin.getline(id,10,'\n');
std::cout << name << std::endl;
std::cout << id << std::endl;

这是输出(我们输入 Meysam 和 12345 作为名称和 ID):

Meysam
12345

但这是为什么呢? 我的意思是因为 cin.getline() 没有清理缓冲区,我们应该能够输入 name 变量,但是程序应该跳过下一个用于 id 的 cin.getline(),因为缓冲区已经被填充以前的 cin.getline().NO? 我想知道我没有正确理解的地方 谢谢。

【问题讨论】:

    标签: c++ buffer cin


    【解决方案1】:

    在第一种情况下,cin&gt;&gt;name 不消耗换行符,它仍然在缓冲区中。 第四行没有被跳过,而是cin.getline() 读取缓冲区中的\n 并停止进一步读取,作为\n 中getline 的默认分隔符。因此 id 只包含换行符。

    在第二种情况下,cin.getline() 读取整行并在使用换行符后停止。现在缓冲区里什么都没有了,所以下一个cin.getline() 会读取你的 id。

    Refer here

    【讨论】:

    • “因此 id 只包含换行符”是错误的。 id 将为空 (id[0] == 0.)
    【解决方案2】:

    std::cin &gt;&gt; name; 将从输入中读取,直到找到分隔符,通常是空格或newline 字符,但分隔符将留在输入流中,因此下次调用getline读取newline 字符并返回一个空行,从而有效地清除id 变量。

    第二个程序有效,因为getline 提取了newline 分隔符,因此下一次调用看不到它并等待输入。

    您可以在cppreference 上看到更好的解释(参见“注释”部分。)

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2011-04-25
      • 2017-04-21
      • 2021-12-19
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2013-09-10
      • 2017-05-14
      相关资源
      最近更新 更多