2015-04-20 108 views
0

在Windows中我使用flushall()函數來清空所有緩衝區,但在Linux中,這不工作,我的scanf()函數,而掃描跳過:scanf()函數被跳過的循環

for(i=0;i<n;i++) 
    { 
    printf("\nEnter alphabet :"); 
    scanf("%c",&x); 
    printf("\nEnter frequency :"); 
    scanf("%f",&probability); 
    /* create a new tree and insert it in 
    the priority linked list */ 
    p=(treenode*)malloc(sizeof(treenode)); 
    p->left=p->right=NULL; 
    p->data=x; 
    p->freq=(float)probability; 
    head=insert(head,p); 
    } 

輸出:

[email protected]:~$ ./a.out 

Enter alphabet :a 

Enter frequency :2 

Enter alphabet : 
Enter frequency :a 

Enter alphabet : 
Enter frequency :2 

Enter alphabet : 
Enter frequency :a 

Enter alphabet : 
+0

可能重複的[Scanf在C中跳過while each循環](http://stackoverflow.com/questions/1669821/scanf-skips-every-other-while-loop-in-c) – axiac

+0

In它的當前形式(使用'scanf(「%c」)'這個問題是ma的重複關於'scanf()'的這種行爲的其他問題。 – axiac

回答

0

你應該在scanf的開頭添加一個空格,fflush(stdin)每前scanf剛清除的標準輸入緩衝區(鍵盤默認情況下),像這樣:

for(i=0;i<n;i++){ 
    printf("\nEnter alphabet :"); 
    fflush(stdin); 
    scanf(" %c",&x); 
    printf("\nEnter frequency :"); 
    fflush(stdin); 
    scanf(" %f",&probability); 
    /* create a new tree and insert it in 
    the priority linked list */ 
    p=(treenode*)malloc(sizeof(treenode)); 
    p->left=p->right=NULL; 
    p->data=x; 
    p->freq=(float)probability; 
    head=insert(head,p); 
    } 

編輯:檢查是否有char xfloat probability

+0

1)'fflush(stdin)'在很多平臺上沒有很好的定義。更好避免。好奇:參考/人使用'fflush(stdin)'建議? 2)scanf(「%f」,&probability)中的空格;''%f''不需要佔用前導空格,儘管不會造成太大傷害 – chux

+0

我只是建議根據以前的程序去做。我分享你的意見,我不喜歡fflush,但以防萬一...... – user24100

0

更新:的OP改變了 「%d」,在第一scanf的爲 「%C」,它可以讓該錯誤,我認爲,發生以後;但我不覺得投入更多的時間在這裏.--

原始回答:輸入永遠不會超出'a'處理,因爲您嘗試使用轉換規範%d讀取它,以獲得整數它不滿足。 (爲了讀取一個字符,你可以指定%c。)Scanf將違規字符放回到輸入中,並嘗試讀取下一個再次失敗的數字,等等。

這裏值得檢查一下scanf的返回值,它總是爲0,表示沒有成功轉換。

+0

對不起,我急着寫了代碼,我提到的輸出是字符'x',你會糾正我的代碼嗎? –

+0

相當一個chuzpe。爲什麼不盡全力閱讀相關文檔,編寫代碼,測試和調試?通常可以解決問題。如果您仍然有疑問,請提供一個最小的獨立示例,最大限度地注意正確輸入和文檔,然後再詢問。而不是浪費我的時間。 –