私は、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 の出力が壊れているのはなぜですか。行末の解釈に関連する移植性の問題はありますか? ロジックの最小限の変更でコードを修正するにはどうすればよいですか。