为什么scanf改变执行顺序?

时间:2011-09-05 19:07:34

标签: c scanf

我正在捕获一些用户输入并将其保存到结构和文件中。

对于每个字段,我首先使用printf编写提示,然后使用scanf将数据捕获到结构中,最后使用fprintf写入文件。

该程序运行正常,但仅在一台计算机上,一个scanf在相应的printf之前执行。

这是问题的核心:

printf("\n color: ");
scanf("%s",&robot1.color);
fputs(robot1.color, f);
fputs("\n",f);

printf("\n energy: ");
scanf("%d",&robot1.energy);
fprintf(f,"%d",robot1.energy);
fputs("\n",f);

printf("\n height: ");
scanf("%f",&robot1.height);
fprintf(f,"%.2f",robot1.height);
fputs("\n",f);

printf("\n weight: ");
scanf("%f",&robot1.weight);
fprintf(f,"%.2f",robot1.weight);
fputs("\n",f);

我使用Dev-C++在两台Windows PC上进行了测试,在使用GCC的Mac上进行了测试。其中一台Windows机器就是造成这种混乱的机器。

正确执行(包括用户输入)是:

color: red
energy: 100
height: 30.5
weight: 500.0

但是在麻烦的电脑中,输入能量值后,它什么都没显示,继续我必须输入高度值。 之后,我看到身高和体重提示,并通过捕捉体重来完成:

color: red
energy: 100
30.5
height:
weight: 500.0

在所有情况下都能正确写入文件,因此,为什么只有一台计算机在scanfprintf时遇到问题?

结构定义是:

typedef struct roboto
{
    char name[10];
    char color[10];
    int energy; 
    float height;
    float weight; 
}robot;

3 个答案:

答案 0 :(得分:4)

我猜测在用户被提示输入之前,stdout没有被刷新的问题。要解决此问题,您可以尝试使用fflush(stdout);在每个打印语句后刷新标准输出。例如:

printf("\n color: ");
fflush(stdout);
scanf("%s",&robot1.color);
fputs(robot1.color, f);
fputs("\n",f);

答案 1 :(得分:3)

标准输出是缓冲的,因此您无法确定何时写入。 调用fflush(stdout)后调用printf强制输出,然后你可以确定输出将被写入。

答案 2 :(得分:0)

也许检查scanf的返回值会给你一些线索。忽略这个价值只是在惹麻烦。