C ++ std :: cin产生额外的输入

时间:2014-07-24 06:15:17

标签: c++ std cin

我是C ++的新手并试图解决一些基本的CodeJam问题。我正在研究Reverse Words。我通过管道输入和编译可执行文件来运行我的代码(在unix环境中): ./compiled.program < input_file.in > output_file.out

这是我的输入(input_file.in):

3
this is a test
foobar
all your base

我会预测输出:

test a is this
foobar
base your all

但是,我得到了输出(output_file.out):


test a is this
foobar

(是的,开头的那个空间是故意的)

这是我的源代码:

#include <string>                                                                                                           
#include <iostream>

int main()
{
      int number_of_cases;
      std::cin >> number_of_cases; 

      for (int i=1; i<=number_of_cases; i++) {
          std::cerr << i << std::endl;

          std::string input = ""; 
          std::getline(std::cin, input);

          while (true) {
              int pos = input.find_last_of(" ");
              if (pos == -1) {
                    std::cout << input;
                    break;
              }   
              std::cout << input.substr(pos+1)+" ";
              input.resize(pos);
        }   
        std::cout << std::endl;
    }   
    return 0;
}

我的问题似乎是从3this is a test之间读取另一个输入源(输入的空白​​来源),但对于我的生活,我找不到原因。所以这就是我的问题:为什么要读取其他输入源?

非常感谢任何帮助。非常感谢你!

2 个答案:

答案 0 :(得分:3)

该行

std::cin >> number_of_cases; 

读入3但停在那里,将换行符留在流中。

因此对于i == 1std::getline(std::cin, input);只是从第一行的末尾读取换行符。由于这不包含空格,因此您触发std::cout << input;,然后分解为std::cout << std::endl,生成空行。

然后3的计数在到达all your base之前就已用尽。

要解决这个问题,你可以在进入循环之前对getline进行虚拟调用(这也会消耗任何尾随空格)。

答案 1 :(得分:2)

在您的程序和示例输入中,当您输入&#39; 3&#39;时,我会输入一个字符3和一个字符&#39; \ n&#39;。所以cin只读取整数字符并留下&#39; \ n&#39;在输入缓冲区中。 std::getline读取&#39; \ n&#39;在第一次迭代中。