std :: getline和std :: vector <std :: string> </std :: string>的奇怪行为

时间:2010-09-01 20:05:37

标签: c++

我有以下代码:

std::vector<std::string> final_output;
std::string input;

int tries = 0;
std::cin >> tries;

int counter = 0;
while(counter < tries) {

    std::getline(std::cin, input); 
    final_output.push_back(input);
    ++counter;

}

鉴于输入:

3
Here Goes
Here Goes 2

输出结果为:

<blank line>
Here Goes
Here Goes 2

奇怪的是,它似乎第一次输入时输入一个空行。

但是,如果我的代码为:

int tries = 3;         // explicitly specifying the number of tries
int counter = 0;
while(counter < tries) {}

它按预期工作。为什么std::cin >> tries导致代码失败?

我已经使用VC ++ 2010和g ++ 4.4.3进行了测试

3 个答案:

答案 0 :(得分:2)

当您输入tries的号码时,您会点击返回键。阅读tries后,点击返回键的回车仍然位于输入缓冲区中。回车通常会转换为换行符。您对getline的下一次调用将读取输入缓冲区中的所有内容,直到下一个换行符。由于第一个字符是一个换行符,因此它将其读作一个零长度的行(即在换行符之前为零个字符)。

答案 1 :(得分:1)

第一个条目的换行符仍在输入缓冲区中。

您可以在阅读std::cin.ignore();的尝试后立即致电cin

这样就会丢弃换行符。

我找到了一个很好的链接,解释了很多关于I / O使用的事情:

答案 2 :(得分:0)

您无法从独立'\n'的第一行吸收std::cin >> tries