| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > А если буква вместо цифры? |
| Автор: Angie 12.12.2003, 06:25 | ||
| Приветствую и сразу к делу. Есть небольшая простенькая программка, функция которой заключается в выводе определенного значения по вводимому ключу. Ключ - целое число. Но самое странное и непонятное (для меня) то, что выводит программа, если ввести не цифру. Код программы:
Если ввести на запрос не цифру, а любой другой символ то получаю бесконечный вывод предыдущего результата. Все это понятно, то там же scanf()!!!(второй). Почему программа не останавливается перед ним? И еще: как тогда исключить такую ситуацию? Разве значения default не достаточно для перехвата неправильно введенного значение, какое оно бы ни было? Заранее спасибо. |
| Автор: Step 12.12.2003, 09:49 |
| проблемма в том что сканф запрашивает у вас число а не символ, когда вы вводите символ, вместо числа, устанавливается флаг конец строки и следующий сканф просто не производит ввод так как ввод закончен, избежать такое можно перенастройко скана на новый формат, но для вашей программы гораздо проще работать просто с символами, и ошибки не будет... но я моги и ошибаться |
| Автор: Mellorn 12.12.2003, 12:02 |
| Полностью соглашусь со Степом, но с небольшой оговоркой: 1) не могу конкретно сказать в чем проблема со считываением но сканф тут ни при чем =) Это моя любимая процедура.... загон идет именно от неправильного значения 2)попробуй сделать так #include <stdio.h> int main() { char number; scanf("%c",&number); while(number!='0') { printf("You've entered the key that is related to the value named - "); switch(number) { case '1': printf("bla.\n\n"); break; case '2': printf("blabla.\n\n"); break; case '3': printf("blablabla.\n\n"); break; default: printf("noname. No such value. Check your Capslock or be more careful in typing, please.\n\n"); break; } printf("Any more tries? Enter the key, or type '0' for exit: "); scanf("%c",&number); printf("\n\n"); } return 0; } |
| Автор: Step 12.12.2003, 12:43 |
| вот именно так и ты будешь застрахован от ошибок, и считается правилом хорошего тона все данные с клавы вводить в символьном виде, а потом преобразовывать с проверкой на ошибки |
| Автор: Angie 12.12.2003, 16:41 |
| Спасибо за советы, но если у меня числа не до 10, а больше, т.е. дву- и более значные? Тогда использование символа не проходит. Именно поэтому и использовался численный тип. Как быть? |
| Автор: Step 12.12.2003, 17:10 |
| в этом случае используется строка символов и тоже преобразовывается с проверкой на ошибки |
| Автор: Angie 12.12.2003, 17:39 |
| 2Step: А без строки никак не извратнуться? 2Mellorn: Твой код у меня чего-то немного глючит (это если не считать отсутствие обработки двузначных чисел). К нужному кейсу выводит еще и дефалт (всегда). Бряк вроде бы нигде не забыт. |
| Автор: Step 12.12.2003, 17:43 |
| Angie, от пользователя трудно извернуться, они твою прогу заглючить смогут даже если это НЕВОЗМОЖНО |
| Автор: Angie 12.12.2003, 20:01 | ||
| Мдяя.. Вот конечный вариант со строкой. Работает. 8)
|
| Автор: Serzh 13.12.2003, 02:01 | ||
| ну вы народ и даете!!!!!!!!!!!!!!!!!!!!! сама функция scanf возвращает результат - ошибка, или кол-во отсканеных значений!!! а еще сканф сканит входной поток(нажатие на клавиши) и если находит ошибку, но делает выход(из scanf) а буфер с введенными клавишами не очишает, по этому и было бесконечнjt повторение одного и того же значения. лучше использовать gets в комбинации с sscanf!!! gets(char *s) - помещает в s все что нажимается до нажатия enter sscanf(char *s, char *f, ...) - тоже, что и scanf, только работает с буфером s. а вот и текст:
|