2011-09-05 61 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檢查返回值會給你一些線索。忽略這個價值只是在尋求麻煩。

相關問題