6

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

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

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

提前致谢。

4

3 回答 3

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&)

于 2013-02-27T20:53:11.033 回答
2

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

于 2013-02-27T20:53:18.920 回答
1

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

于 2013-02-27T20:51:12.453 回答