好的,所以我正在尝试学习C,我希望我的用户输入一个值,所以我使用的是scanf。我开始没有冲洗,因为在输入两个值之前没有任何东西出现。现在我有了他们虽然我遇到了同样的问题但是在输入两个数字之后仍然没有输出。这是我的代码:
#include <stdio.h>
using namespace std;
int main()
{
int i1, i2, sums;
printf( "Enter first integer\n" );
fflush(stdout);
scanf( "%d", &i1 );
printf( "Enter second integer\n" );
fflush(stdout);
scanf( "%d", &i2 );
sums = i1 + i2;
printf( "Sum is %d\n", sums );
fflush(stdout);
return 0;
}
非常感谢任何帮助。
答案 0 :(得分:1)
以下对我来说很好:
#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规则的奇怪事情。
我很确定stdout,即使它不是像stderr那样的行缓冲,如果你试图从stdin读取,也会自动刷新(至少在我使用过的大多数环境中都是如此)。
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 para 3 :当流未缓冲时,字符应尽快从源或目的地出现。否则,可以将字符作为块累积并发送到主机环境或从主机环境发送。当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输。当流被行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。
7.9.13 para 7 :在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取传统输入),标准输出(用于写入常规输出),和标准错误(用于写入诊断输出)。最初打开时,标准错误流未完全缓冲;当且仅当可以确定流不参考交互设备时,标准输入和标准输出流是完全缓冲的。
可能发生的事情是Eclipse与程序输入和输出交互的方式可能导致程序无法将stdout识别为交互设备。然后它将被完全缓冲,这意味着在缓冲区已满或程序终止之前您将看不到输出。
答案 1 :(得分:0)
我认为你需要在“scanf”旁边加上“\ n”。像这样。
scanf( "%d\n", &i2 );
试试吧。
答案 2 :(得分:0)
我认为你正在刷出错误的东西,尝试使用stdin而不是使用stdout来刷新scanf,就像这样
的#include
main()的 { int i,j,sums; printf(“输入第一个整数\ n”);
scanf("%d",&i);
fflush(stdin);
printf("enter the second integer\n");
scanf("%d",&j);
fflush(stdin);
sums = i + j;
printf("sum is %d\n",sums);
//fflush(stdin);
getchar();
}