代码之家  ›  专栏  ›  技术社区  ›  Kevin

c中的无限循环问题

  •  0
  • Kevin  · 技术社区  · 11 年前

    下面的代码可以编译,但是当我运行它时,我出现了一个错误,导致了无限循环。循环甚至无法在我应该输入新值的位置进行扫描,而是始终打印提示。我到底做错了什么导致了这个问题。。

    #include <stdio.h>
    #include <stdbool.h>
    
    //variables
    bool flag = false;
    int input = 0;
    //function protoypes
    void  get_input(void);
    bool  is_valid(int);
    void  print_pattern(int number);
    
    int main(){
        get_input();
    
        print_pattern(input);
        return 0;
    }
    
    void get_input(){
        while(flag == false){
            printf("please enter an odd number betwen 1 and 9\n");
            scanf("%d", &input);
            if(is_valid(input)){
                flag = true;
            }else{
                flag = false;
            }
    
        }
    }
    
    bool is_valid(int number){
        if(number == 1 || number == 3 || number == 5 || number == 7 || number ==  9){
            return true;
        }else{
            return false;
        }
    }
    
    void print_pattern(int number){
        int i = 0;
        for(i = 0; i < number; i++){
            printf("%s",i);
        }
    }
    
    4 回复  |  直到 11 年前
        1
  •  1
  •   M Oehm    11 年前

    你陷入了 scanf trap:当您尝试扫描流(例如文件或 stdin ),但流不包含有效的数字,流将重置为扫描前的位置。这意味着,你的 while 循环反复扫描相同的无效输入。

    解决方案是首先读取字符串(使用 scanf("%s", ...) 或与 fgets 然后用 sscanf 或者,也许更好 strtol 。所有这些函数都有一个错误条件,如其文档中所述,您应该检查。还有一个问题是如何处理输入过程中可能遇到的意外文件结尾。

    最后,您应该 flag 本地到 get_input 。还应考虑 获取输入 返回带有特殊值(例如-1)的读取值,以指示文件结束。

    示例实现可能如下所示。

    int get_input()
    {
        char buf[80];
        int input = 0;
        bool flag = false;
    
        while (flag == false) {
            printf("please enter an odd number betwen 1 and 9\n");
    
            if (fgets(buf, sizeof(buf), stdin) == NULL) return -1;
            flag = (sscanf(buf, "%d", &input) == 1 && is_valid(input));
        }
    
        return input;
    }
    

    (是的,以快速而肮脏的方式读取输入以外的内容并不容易。)

    其他人已经指出了错误的格式说明符 -Wall 应该抓住了。

        2
  •  1
  •   SMA    11 年前

    除非输入奇数,否则循环不会退出。

    而且 %s 表示字符串,因此您可能需要将print语句更改为:

    printf("%d",i);
             ^
    

    将代码改为:

    flag = is_valid(input);
    
        3
  •  0
  •   Arun A S    11 年前

    导致无限循环的原因可能是您输入了字符而不是整数。也许这会有帮助

    void get_input(){
        char ch;
     while(flag == false){
        printf("please enter an odd number betwen 1 and 9\n");
        scanf("%d", &input);
        while((ch=getchar()!= '\n') && ch != EOF);   // this flushes the input buffer to get rid of characters. 
        flag = is_valid(input);       // This is better
      }
    
    }
    

    我还发现你的代码有问题。 i 是int,但您正在使用 %s (用于字符串)

    printf("%s",i);
    

    将其更改为

    printf("%d",i);
    

    相反

        4
  •  0
  •   VolAnd    11 年前

    问题不在循环中。输出中的实际问题(%s开头,共%d):

    void print_pattern(int number){
        int i = 0;
        for(i = 0; i < number; i++){
            printf("%d",i);  // output number
        }
    }
    

    并且可能在输入缓冲器中:

    void get_input(){
        while(flag == false){
            printf("please enter an odd number betwen 1 and 9\n");
            scanf("%d", &input);
            while( getchar() != '\n' ); // clean input bufer
            if(is_valid(input)){
                flag = true;
            }else{
                flag = false;
            }
        }
    }
    

    还应考虑以下验证功能:

    bool is_valid(int number){
        return (number % 2); // check number
    }