以下对我来说很好:
#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。您使用的是什么平台和编译器?
更新:一种可能性是,因为您在 Eclipse 环境中运行,它可能会做一些奇怪的事情,干扰正常的 I/O 规则。
我很确定标准输出,即使它不像标准错误那样是行缓冲的,如果你尝试从标准输入读取,也会自动刷新(至少在我使用过的大多数环境中,这是少数)。
Eclipse 可能会摆弄将控制台连接到程序的实际 I/O 的方式。我会尝试将代码编译为独立的可执行文件,然后在 Eclipse 环境之外运行它。如果它在那里运行良好,那么它可能是 Eclipse 和程序之间的交互。
正如我所说,您的程序在 XP 和 Cygwin 下运行良好,即使没有刷新。
需要进一步解释。正如 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 第 7 段:在程序启动时,预定义了三个文本流,不需要显式打开 - 标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流没有完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才被完全缓冲。
可能发生的情况是 Eclipse 与程序输入和输出交互的方式可能导致程序无法将 stdout 识别为交互式设备。然后它将被完全缓冲,这意味着在缓冲区已满或程序终止之前您不会看到输出。