c中的无限循环问题

时间:2015-02-27 06:48:26

标签: c loops infinite

下面的代码编译,但是当我运行它时,我有一个导致无限循环的错误。循环甚至没有到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);
    }
}

4 个答案:

答案 0 :(得分:1)

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

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

printf("%d",i);
         ^

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

flag = is_valid(input);

答案 1 :(得分: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 :(得分:0)

引起无限循环可能是因为您输入的是字符而不是整数。也许这会有所帮助

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

代替

答案 3 :(得分:0)

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