2015-02-27 1 views
0

Код ниже компилируется, однако, когда я его запускаю, у меня есть ошибка, вызывающая бесконечный цикл. Цикл даже не добирается до scanf, где я должен принимать новое значение, а просто выводит подсказку. Что именно я сделал неправильно, чтобы вызвать эту проблему.Проблема с бесконечным контуром в c

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

Бесконечный цикл происходит, если ваш вход не является допустимым числом, не так ли? –

+0

Это делает для каждого числа действительным или недействительным – Kevin

+0

@Kevin, закройте свой компилятор, затем откройте его и запустите этот код еще раз. Он не входит в бесконечный цикл на моем. (какой компилятор вы используете в любом случае) –

ответ

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.

+0

Спасибо, что это решило. Я собираюсь прочесть это. Я ценю ваше время и силы. – Kevin

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

вместо

1

Ваш цикл выхода обыкновение, если вы не введете нечетное число ,

Также %s представляет собой строку, так что вам, возможно, потребуется изменить оператор печати на:

printf("%d",i); 
     ^

Вместо этого, если еще, изменить свой код:

flag = is_valid(input); 
0

Проблема не в петля. Реальная проблема в выходе (% S istead из% г):

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 
} 
+0

Должно быть' return (number <10 && 1 == number% 2); ' –

+0

это для выбора Кевина :-) – VolAnd

 Смежные вопросы

  • Нет связанных вопросов^_^