【问题标题】:cin.get() in a loopcin.get() 在循环中
【发布时间】:2013-02-27 20:40:42
【问题描述】:

我试图从标准输入中读取。第一行是我将阅读的行数。我接下来阅读的行将再次打印。代码如下:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    for (unsigned int i = 0; i < n; ++i)
    {
        char a[10];
        cin.get (a, 10);
        cout << "String: " << a << endl;
    }
    return 0;
}

当我运行它并给出行数时,程序退出。还没弄明白怎么回事,所以决定在这里问一下。

提前致谢。

【问题讨论】:

  • 我认为它的行为不应该像你说的那样......再试一次。
  • 再试一次 - 同样的错误

标签: c++ cin


【解决方案1】:

混合格式化和未格式化的输入充满了问题。在您的特定情况下,这一行:

std::cin >> n;

使用您输入的数字,但将'\n' 留在输入流中。

随后,这一行:

cin.get (a, 10);

不消耗任何数据(因为输入流仍然指向'\n')。出于同样的原因,下一次调用也不消耗任何数据,依此类推。

然后问题就变成了“我如何使用'\n'?”有两种方法:

你可以读一个字符然后扔掉:

cin.get();

你可以读一整行,不管长度:

std::getline(std::cin, some_string_variable);

您可以忽略当前行的其余部分:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

作为一些相关建议,我永远不会使用std::istream::get(char*, streamsize)。我总是更喜欢:std::getline(std::istream&amp;, std::string&amp;)

【讨论】:

    【解决方案2】:

    cin.get(a, 10) 之前添加cin.get() 将解决您的问题,因为它将读取输入流中剩余的端行。

    【讨论】:

      【解决方案3】:

      我认为在使用 cin 时了解这一点很重要:http://www.cplusplus.com/forum/articles/6046/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2018-07-28
        • 2014-03-10
        相关资源
        最近更新 更多