2015-12-17 3 views
1

Я хочу написать код, который проверяет, вводит ли пользователь правильный ввод, т. Е. 1, 2, 3 или 4. В противном случае выводится сообщение «ошибка ввода». Если пользователь вводит букву, например, поскольку входная переменная в scanf имеет тип char, она также работает. Но в случае нескольких символов я расскажу о следующем решении: я пытаюсь ввести все символы в массив char и проверить, сколько членов в нем. Я написал следующий код:Проверьте входной файл scanf

char option; 
int countIn; 
char inArray[10]; 

do { //while option!=4 
    scanf("%c", &option); 

    while (countIn < 10 && scanf("%c", &option) != -1 && option != '\n') { 
     inArray[countIn] = option; 
     countIn++; 
    } 

    if (countIn > 1) { option = 10; } 
    else { option = inArray[0]; } 
    countIn = 0; 
} while (option != '4'); 

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

какой я сделал неправильно?

+2

'countIn' не инициализирован! – chqrlie

+0

@Juliette Вы можете попробовать [Это тоже] (http://stackoverflow.com/questions/31770861/validate-parameter-for-0-or-1/31772378#31772378). – Michi

ответ

5

Заменить обе scanf() вызовы с:

scanf(" %c", &option); 

Обратите внимание на пробел в строке формата, который говорит зсапЕ потреблять все пробельные. Причина, по которой это кажется, чтобы пропустить новую строку, оставшуюся во входном буфере предыдущим входом.

scanf() От:

·  A sequence of white-space characters (space, tab, newline, 
      etc.; see isspace(3)). This directive matches any amount of 
      white space, including none, in the input. 

Обратите внимание, что даже если EOF обычно определяется как -1, это не безопасно предположить так. Я настоятельно рекомендую использовать EOF вместо -1.

+0

@ I3x Спасибо за ваш ответ. Я пробовал этот параметр, но он не работает ... Когда я впервые вхожу в 1 в scanf, программа не продолжается и застряла там. – Juliette

+0

У вас есть два последовательных вызова scanf. Один за пределами цикла и один в условии цикла. Поэтому для этого требуется два последовательных входа. Я не совсем понимаю, что у вас есть два цикла, и оба работают на 'option'. Если вы можете уточнить, что ваш код должен решить, я могу предложить лучшее решение. –

+0

Спасибо .. Я должен написать меню, и пользователь должен ввести свой выбор 1,2,3 или 4. В противном случае выводится сообщение об ошибке ввода. Я должен предоставить все возможные случаи. Я об этом; в случае, когда ввод представляет собой число, достаточно написать случай по умолчанию, в случае, если вход является буквой, если я использую переменную ввода char, он тоже работает. И последний случай, когда пользователь вводит выражение длиннее одного символа, поэтому я об этом решении. Я надеюсь, что это было достаточно ясно ... – Juliette

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