循环中的cin.get()

时间:2013-02-27 20:40:42

标签: c++ cin

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

#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;
}

当我运行它并给出行数时,程序退出。我还没弄清楚发生了什么,所以我决定在这里问一下。

提前致谢。

3 个答案:

答案 0 :(得分:6)

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

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&, std::string&)

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我认为在使用cin:http://www.cplusplus.com/forum/articles/6046/

时了解这一点非常重要