scanf为什么要更改执行顺序?

scanf为什么要更改执行顺序?,c,scanf,C,Scanf,我正在捕获一些用户输入并将其保存到结构和文件中 对于每个字段,我首先使用printf编写一个提示,然后使用scanf将数据捕获到struct,最后使用fprintf写入文件 该程序运行良好,但仅在一台计算机上,一个scanf在其相应的printf之前执行 这是问题的核心: printf("\n color: "); scanf("%s",&robot1.color); fputs(robot1.color, f); fputs("\n",f); printf("\n energy: "

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

对于每个字段,我首先使用printf编写一个提示,然后使用scanf将数据捕获到struct,最后使用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);
我在两台Windows PC上用GCC测试了它,在Mac上用GCC测试了它。其中一台Windows机器就是造成这一切混乱的机器

正确的执行用户输入包括:

color: red
energy: 100
height: 30.5
weight: 500.0
但在这个麻烦的电脑里,在我输入能量值后,它什么也没有显示,要继续,我必须输入高度值。 之后,我会看到身高和体重提示,并通过捕获体重来完成:

color: red
energy: 100
30.5
height:
weight: 500.0
文件在所有情况下都是正确写入的,那么,为什么只有一台计算机在scanf和printf方面有问题呢

结构定义为:

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

我猜这是一个问题,在提示用户输入之前,stdout没有被刷新。要解决此问题,可以尝试在每个打印语句之后使用fflushstdout;刷新stdout;。例如:

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

我猜这是一个问题,在提示用户输入之前,stdout没有被刷新。要解决此问题,可以尝试在每个打印语句之后使用fflushstdout;刷新stdout;。例如:

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

标准输出已缓冲,因此无法确定何时写入。
在调用printf后,调用fflushstdout强制写入输出,然后您可以确保将写入输出。

标准输出已缓冲,因此无法确定何时写入。
调用printf后,调用fflushstdout强制写入输出,然后您可以确定输出将被写入。

也许检查scanf的返回值会给您一些线索。忽略该值只是自找麻烦。

也许检查scanf的返回值会给你一些线索。忽略该值只是自找麻烦。

它不起作用,还有其他建议吗?你知道为什么这只发生在一台计算机上吗?你在那台计算机上使用了不同的编译器或操作系统吗?它不起作用,还有其他建议吗?你知道为什么这只发生在一台计算机上吗?你在那台计算机上使用了不同的编译器或操作系统吗?谢谢,但正如另一个答案所述,这不起作用,还有其他想法吗?我不明白你的代码为什么不起作用。我唯一建议尝试的另一件事是使用write或_write系统调用将消息直接写入文件描述符1 stdout,而不是printf。谢谢,但正如另一个答案中所述,这不起作用,还有其他想法吗?我不明白您的代码为什么不起作用。我唯一建议尝试的另一件事是使用write或_write系统调用将消息直接写入文件描述符1 stdout,而不是printf。