我是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;
}
我的问题似乎是从3
和this is a test
之间读取另一个输入源(输入的空白来源),但对于我的生活,我找不到原因。所以这就是我的问题:为什么要读取其他输入源?
非常感谢任何帮助。非常感谢你!
答案 0 :(得分:3)
该行
std::cin >> number_of_cases;
读入3
但停在那里,将换行符留在流中。
因此对于i == 1
,std::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;在第一次迭代中。