以下は私にとってはうまくいきます:
#include <stdio.h>
int main() {
int i1, i2, sums;
printf( "Enter first integer\n" );
scanf( "%d", &i1 );
printf( "Enter second integer\n" );
scanf( "%d", &i2 );
sums = i1 + i2;
printf( "Sum is %d\n", sums );
return 0;
}
そして与えます:
Enter first integer
1
Enter second integer
6
Sum is 7
これは XP で Cygwin を使用しています。どのプラットフォームとコンパイラを使用していますか?
更新: 1 つの可能性は、Eclipse 環境内から実行しているため、通常の I/O ルールに干渉する奇妙なことを行っている可能性があることです。
stderr のように行バッファリングされていなくても、stdin から読み込もうとすると stdout が自動フラッシュされることは確かです (少なくとも私が使用したほとんどの環境では、これは少数です)。
Eclipse は、コンソールをプログラムの実際の I/O に接続する方法をいじっている可能性があります。コードをスタンドアロンの実行可能ファイルにコンパイルしてから、Eclipse 環境の外で実行しようとしました。そこで問題なく動作する場合、それはおそらく Eclipse とプログラムの間の相互作用です。
先に述べたように、フラッシュがなくても、Cygwin を使用した XP でプログラムは正常に動作します。
さらに説明が必要です。Jerry Coffin がコメントで正しく指摘しているように、C 標準 (c1x、2009/03/01 ドラフト) には次のように記載されています。
5.1.2.1 パラ 6 : 対話型デバイスの入力および出力ダイナミクスは、7.19.3 で指定されているとおりに行われるものとします。これらの要件の意図は、プログラムが入力を待機する前にプロンプト メッセージが実際に表示されるようにするために、バッファなしまたは行バッファ付きの出力をできるだけ早く表示することです。
5.1.2.1 パラ 7 : 対話型デバイスを構成するものは実装定義です。
7.9.13 パラ 3 : ストリームがバッファリングされていない場合、文字はソースから、または宛先でできるだけ早く表示されるように意図されています。そうしないと、文字が蓄積され、ブロックとしてホスト環境との間で送受信される可能性があります。ストリームが完全にバッファリングされている場合、文字は、バッファがいっぱいになったときにブロックとしてホスト環境との間で送受信されることを意図しています。ストリームが行バッファリングされている場合、文字は、改行文字が検出されたときにブロックとしてホスト環境との間で送受信されることを意図しています。
7.9.13 para 7 : プログラムの起動時に、3 つのテキスト ストリームが事前定義されており、明示的に開く必要はありません。標準入力 (従来の入力を読み取るため)、標準出力 (従来の出力を書き込むため)、および標準エラー (診断出力を書き込むため) です。最初に開いたとき、標準エラー ストリームは完全にバッファリングされていません。標準入力および標準出力ストリームは、ストリームが対話型デバイスを参照していないと判断できる場合にのみ、完全にバッファリングされます。
Eclipse がプログラムの入出力と対話する方法が原因で、プログラムが stdout を対話型デバイスとして認識しない可能性があります。その後、完全にバッファリングされます。つまり、バッファがいっぱいになるか、プログラムが終了するまで、出力は表示されません。