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は、カーソルを現在の行の先頭に戻します。したがって、呼び出しでは、STDOUT カーソルは、. 次に出力される文字は で、行の最初の文字 ( ) を上書きします。printf\r'L

ファイルに no がない場合、この動作は見られません\r

この問題を解決する簡単な解決策: \rLinux および Unix で実行している場合は、手動で確認してください。

于 2012-10-22T00:28:47.903 に答える