2012-07-03 5 views
2

По какой-то причине, если пользователь вводит неверный тип данных, например «j» или «%», цикл перестает запрашивать ввод и будет продолжать отображение "Enter an integer >" снова и снова. Как я могу заставить программу обрабатывать плохие входы? И почему ввод нечислового значения вызывает такое странное поведение?Нечетный ввод вызывает бесконечный цикл

#define SENTINEL 0; 
int main(void) { 
    int sum = 0; /* The sum of numbers already read */ 
    int current; /* The number just read */ 

    do { 
    printf("\nEnter an integer > "); 
    scanf("%d", &current); 
    if (current > SENTINEL) 
     sum = sum + current; 
    } while (current > SENTINEL); 
    printf("\nThe sum is %d\n", sum); 
} 
+2

'зсапЕ()' останавливается первый несимметричный символ. Он хранит этот символ в буфере. В следующий раз через цикл символ все еще присутствует, и 'scanf' останавливается. В следующий раз через цикл символ все еще присутствует, и 'scanf' останавливается. В следующий раз через цикл ... ... – pmg

+0

Этот код даже не компилируется из-за значения макроса 'SENTINEL'. Вероятно, вы хотите иметь '#define SENTINEL 0'. –

+0

Это была только опечатка. Это было так, как вы написали его в оригинальной программе, и я исправил ее выше. –

ответ

3

Если scanf() не удается найти вход соответствия, переменная current будет неизменным: проверить возвращаемое значение scanf():

/* scanf() returns the number of assignments made. 
    In this case, that should be 1. */ 
if (1 != scanf("%d", &current)) break; 

Если вы хотите продолжать принимать входные сигналы после недопустимого ввода, инвалиду данные должны быть считаны с stdin, поскольку они останутся, как указано в комментариях к pmg. Одним из возможных путей были бы использовать спецификатор формата "%*s", который считывает входные данные, но не выполняет задания:

if (1 != scanf("%d", &current)) 
{ 
    scanf("%*s"); 
} 
else 
{ 
} 
+0

Так почему же программа не ждет ввода пользователя на следующей итерации цикла? Кажется, что он пропускает шаг scanf. –

+0

@RobAlejandroVolgman, вход непрочитан и все еще существует в следующий раз, когда вызывается 'scanf()'. – hmjd

1

Один из способов будут читать ввод в строку, а затем преобразовать строку в тип данных вы хотите.

Мой C является немного ржавый, но я помню, используя fgets() прочитать строку, а затем sscanf() для разбора/«читать» строку в переменных я был заинтересован.

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