2014-09-02 96 views
-3

我做了一個簡單的程序,用#代表一切都可以正常工作,只是我的while循環在不工作時不能提示用戶快速幫助?如何使用while循環提供用戶提示?

#include<stdio.h> 

int main() { 
    int n; 

    do { 
     printf("enter a non negitive number less than equal to 23"); 
     scanf("%d\n",&n); 

     for(int i=0;i<n;i++) 
     { 
      for(int j=0;j<n+1;j++) 
      { 
       if(j <= n-(i+2)) 
        printf(" "); 
       else 
        printf("#"); 
      } 
      printf("\n"); 
     } 
    }  
    while(n < 23); 

    printf("thanks for using my program"); 

    return 0; 
} 
+2

「不工作」如何?會發生什麼,你期望發生什麼? – cdhowie 2014-09-02 21:19:03

+1

你是否檢查'scanf'的返回值? – 2014-09-02 21:20:16

+0

@cdhowie當我輸入n> 23它仍然打印我不想要的三角形 – user3315556 2014-09-02 21:24:11

回答

2

正如評論所說,你的問題是,它打印輸出,即使當你輸入一個數超過23。(我重複這一點,因爲此信息不存在在問題本身。)

這是因爲在do ... while循環的處評估條件。如果要在讀取數字後立即退出,則需要在讀取輸入後立即測試條件。

嘗試在函數中封裝打印和讀取邏輯;這將使其更容易用作while循環中的條件。

int prompt_and_read(int * output) { 
    printf("enter a non negitive number less than equal to 23: "); 
    fflush(stdout); 
    return scanf("%d\n", output); 
} 

然後,你可以這樣做:

while (prompt_and_read(&n) && n < 23) { 
    .... 
} 

這是在多個方面的改進:

  • 它刷新輸出,以確保及時得到顯示。 printf()可能不刷新輸出,直到寫入換行符。
  • 如果循環讀取數字23或更大,則該循環將立即終止。
  • 因爲您沒有檢查scanf()的返回值,所以如果輸入在讀取數字23或更大之前結束,則循環將無限持續。測試scanf()的結果通過在沒有輸入可讀的情況下終止循環來解決此問題。
0

如果你問我想你問...

標準輸出是行緩衝,這意味着產量將不會出現在控制檯上,直到緩衝區滿你發送一個換行你手動刷新fflush()

嘗試以下操作:

printf("enter a non negitive number less than equal to 23: "); 
fflush(stdout); 
scanf("%d",&n); 

fflush呼叫將強制輸出出現在控制檯上。

+0

不調用'scanf'刷新stdout? – 2014-09-02 21:26:54

+0

@RSahu:不,你期待爲什麼? – 2014-09-02 21:28:50

+0

我似乎錯了。我認爲它的確如此。但顯然它不需要。 – 2014-09-02 21:31:58