2013-03-16 2 views
0

У меня возник вопрос относительно использования scanf с недопустимым возвратом. Вот фрагмент кода, я тестирование:Использование while (scanf (...) == 0) правильно

printf("Please enter a number\n"); 
while (scanf("%d",&number)==0) 
{ 
    printf("Try again.\n"); 
    scanf("%d",&number); 
} 

Мои рассуждения показывают, что если используется неверный тип, мой второй зсапЕ должен спросить снова и протестировать новое введенное значение. Однако это не так, и сообщение «Повторить попытку» никогда не прекращает печать, поэтому я должен завершить его вручную. Я не знаю, почему это происходит. Я не хочу использовать scanf перед циклом while, если это возможно, хотя я знаю, что это возможное обходное решение. Буду признателен за любую помощь по этому вопросу. Благодарю.

+1

Наиболее очевидная проблема: ваш цикл вызывает 'scanf' * дважды * каждый раз, когда он проверяет результат. Это не может быть правильным. –

+1

Yo не улавливает возврат in-loop scanf! и входной поток все еще не взят, потому что вы получаете бесконечный цикл. я [ответил] (http://stackoverflow.com/questions/15447810/c-project-scanf/15448405#15448405) вопрос simlar ранее сегодня прихватил на нем – A4L

+0

Хорошо, спасибо за ссылку. Я посмотрю на это. – russ0

ответ

4

scanf не возвращает код ошибки. Он возвращает количество успешно выполненных конверсий.

Что касается бесконечного цикла, она не потребляет входные данные, которые не могут быть преобразованы. Поэтому он неоднократно пытается сопоставить ту же строку, что и число. Попробуйте использовать fgets для отказа от входного сигнала.

+0

Спасибо за предложение. Однако мы не были введены в fgets в моем классе программирования, и поэтому нам не разрешено использовать его. То, что я хочу достичь, следующее: Запросить пользователя для ввода. Если этот вход имеет тот же тип, что и int, тогда scanf вернет 1, и мы сможем продолжить работу с остальной частью кода. Однако, если scanf возвращает 0, я должен повторно спросить, пока не получу тип int. – russ0

0

scanf() может возвращать EOF, чтобы указать на отказ входного сигнала.

«Функция scanf возвращает значение макроса EOF, если произошел сбой ввода до завершения первого преобразования (если таковой имеется). В противном случае функция scanf возвращает количество назначенных входных элементов, которое может быть меньше, чем предусмотрено для или даже нуля, в случае неудачного совпадения ошибок ». C11 7.21.6.4

Использование scanf("%d", ... после неудачной scanf("%d", ... только результат в бесконечном цикле, поскольку каждый scanf() пытается потреблять нецифры, не-пространство и упущение. Чтобы преодолеть эту проблему, необходимо уничтожить оскорбительные данные.

printf("Please enter a number\n"); 
int number; 
int Count; 
while ((Count = scanf("%d",&number)) != 1) { 
    if (Count < 0) { 
    exit(1); // No more input possible 
    } 
    // Some char is preventing scanf() from reading an int 
    scanf("%*c"); // Get it and throw away 
    printf("Try again.\n"); 
} 
printf("number = %d\n", number); 
Смежные вопросы