【问题标题】:Infinite loop issue in cc中的无限循环问题
【发布时间】:2015-04-29 19:33:21
【问题描述】:

下面的代码可以编译,但是当我运行它时,我遇到了一个导致无限循环的错误。循环甚至没有到达我应该接受新值的 scanf ,而是总是打印提示。我到底做错了什么导致这个问题..

#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);
    }
}

【问题讨论】:

  • 如果您的输入不是有效数字,就会发生无限循环,对吧?
  • 它对每个数字都这样做,无论是有效还是无效
  • @Kevin ,关闭您的编译器,然后打开它并再次运行此代码。它不会进入我的无限循环。 (无论如何你都在使用哪个编译器)
  • 我在我们学校的服务器上使用 GCC 编译器,并使用以下命令编译它 gcc -o program1 lab3.c
  • 不是答案,但printf("%s",i); 应该是printf("%d",i);

标签: c loops infinite


【解决方案1】:

您已陷入scanf 陷阱:当您尝试从流(例如文件或stdin)中扫描十进制数,但流不包含有效数字时,流被重置到扫描前的位置。这意味着,您的 while 循环会一遍又一遍地扫描相同的无效输入。

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

最后,您应该将flag 设为get_input 的本地地址。还可以考虑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】:

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

另外%s 代表字符串,因此您可能需要将打印语句更改为:

printf("%d",i);
         ^

不要做 if else,而是将代码更改为:

flag = is_valid(input);

【讨论】:

    【解决方案3】:

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

    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】:

      问题不在循环中。输出中的真正问题(%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
      }
      

      【讨论】:

      • 应该是return (number &lt; 10 &amp;&amp; 1 == number % 2);
      • 这是凯文的选择:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多