Почему этот пример застрял в бесконечном цикле в 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;
}