2014-09-02 62 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