Почему этот пример застрял в бесконечном цикле в C?

В приведенном ниже примере, если я введу символ в терминал Mac OS X, программа застрянет в бесконечном цикле, печатая Please enter a number: строка за строкой и никогда не позволяя пользователю вводить что-либо. Что не так с этим кодом? Что это за исправление? Я хочу изменить код таким образом, чтобы, если число не было введено, пользователю было предложено выдать сообщение об ошибке и снова попросить ввести номер.

#include <stdio.h>

int main(int argc, const char * argv[]) {

    int number = 0, isnumber;
    getagin: printf("Please enter a number:\n");
    isnumber = scanf("%i", &number);
    if(isnumber) {
        printf("You enterd a number and it was %i\n", number);
    } else {
        printf("You did not eneter a number.\n");
        goto getagin;
    }

    return 0;
}

Редактировать: я отредактировал код после прочтения предложений и исправил проблему с бесконечным циклом. Это неплохое решение для проблемы бесконечного цикла, и с помощью простого цикла я говорю C искать любой не числовой символ. Код ниже не позволит вводить данные, как 123abc,

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(int argc, const char * argv[]) {

    char line[10];
    int loop, arrayLength, number, nan;
    arrayLength = sizeof(line) / sizeof(char);
    do {
        nan = 0;
        printf("Please enter a number:\n");
        fgets(line, arrayLength, stdin);
        for(loop = 0; loop < arrayLength; loop++) { // search for any none numeric charcter inisde the line array
            if(line[loop] == '\n') { // stop the search if there is a carrage return
                break;
            }
            if((line[0] == '-' || line[0] == '+') && loop == 0) {
                continue;
            } // Exculude the sign charcters infront of numbers so the program can accept both negative and positive numbers
            if(!isdigit(line[loop])) { // if there is a none numeric character then add one to nan and break the loop
                nan++;
                break;
            }
        }
    } while(nan || strlen(line) == 1); // check if there is any NaN or the user has just hit enter
    sscanf(line, "%d", &number);
    printf("You enterd number %d\n", number);
    return 0;
}

1 ответ

Решение

Причина ввода бесконечного цикла при вводе нецифрового символа заключается в том, что в буфере остается нецифровый символ, так как он не читается scanf для следующего чтения scanf (так как он не соответствует спецификатору формата). на следующей итерации scanf снова находит этот символ и не читает его и сразу выходит. Это происходит многократно, и вы получаете бесконечный цикл. Поместите while(getchar() != '\n'); Заявление потреблять этот персонаж.

Попробуй это

#include <stdio.h>

int main(int argc, const char * argv[]) {

    int number = 0, isnumber;
    getagin: printf("Please enter a number:\n");
    isnumber = scanf("%i", &number);
    if(isnumber) {
        printf("You enterd a number and it was %i\n", number);
    } else {
        printf("You did not eneter a number.\n");
        while(getchar() != '\n'); // T consume all non-digits
        goto getagin;
    }

    return 0;
}
Другие вопросы по тегам