2

我知道混合 cin 和 getline 的常见问题。我相信这是不同的。

这是程序:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main() {
  int a;
  string line;
  cin >> a;
  printf("A is '%d'\n", a);
  getline(cin, line);
  printf("Line is '%s'\n", line.c_str());
  cout << cin.fail() << cin.eof() << cin.bad() << endl;
}

我还有一个使用 istream::getline 编写的版本。我相信这里给出的所有输入案例的结果都是相同的。

a.out < test1
A is '1'
'ine is ' abc 2
000

a.out < test2
A is '1'
Line is ' abc 2'
000

其中 test1 是$'1 abc 2\r\n'(9 个字节),而 test2 是$'1 abc 2\n'(8 个字节)。

我没有在 Windows 下明确完成这些测试,但我有一种预感,即输出是“如预期的那样”,即与测试 2 的输出相同。

我的问题是:解释测试1的输出。例如:为什么printf输出损坏;是否存在与行尾解释相关的可移植性问题;如何以最小的逻辑变化来修复代码。

4

1 回答 1

2

在 Linux 下,从输入流getline中删除。\n但是,它不会删除\r.

回车( \r)将光标返回到当前行的开头。所以在printf调用中,当 STDOUT 光标看到\r. 它打印的下一个字符是',它将覆盖行上的第一个字符 (the L)。

当文件中没有时,您不会看到此行为\r

解决此问题的简单方法:\r在 Linux 和 Unix 下运行时手动检查。

于 2012-10-22T00:28:47.903 回答