2011-09-05 31 views
1

我捕获一些用户输入并将其保存到结构和文件。为什么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和Mac上使用GCC。其中一台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

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

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

它没有工作,任何其他建议?任何想法为什么这只发生在1台电脑上? – ghopper3

+1

您是否在该计算机上使用不同的编译器或操作系统? – GWW

2

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

+0

谢谢,但正如其他答案所述,这是行不通的,还有其他想法? – ghopper3

+0

我不明白你的代码为什么不起作用。 我可以建议尝试的唯一的其他事情是使用'write'或'_write'系统调用直接将消息写入文件描述符1(stdout)而不是'printf'。 –

0

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

相关问题