![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Angie |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.7.2003 Репутация: нет Всего: нет |
Приветствую и сразу к делу.
Есть небольшая простенькая программка, функция которой заключается в выводе определенного значения по вводимому ключу. Ключ - целое число. Но самое странное и непонятное (для меня) то, что выводит программа, если ввести не цифру. Код программы:
Если ввести на запрос не цифру, а любой другой символ то получаю бесконечный вывод предыдущего результата. Все это понятно, то там же scanf()!!!(второй). Почему программа не останавливается перед ним? И еще: как тогда исключить такую ситуацию? Разве значения default не достаточно для перехвата неправильно введенного значение, какое оно бы ни было? Заранее спасибо. |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
проблемма в том что сканф запрашивает у вас число а не символ, когда вы вводите символ, вместо числа, устанавливается флаг конец строки и следующий сканф просто не производит ввод так как ввод закончен, избежать такое можно перенастройко скана на новый формат, но для вашей программы гораздо проще работать просто с символами, и ошибки не будет...
но я моги и ошибаться -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Mellorn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2003 Репутация: 1 Всего: 1 |
Полностью соглашусь со Степом, но с небольшой оговоркой:
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 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
вот именно так и ты будешь застрахован от ошибок, и считается правилом хорошего тона все данные с клавы вводить в символьном виде, а потом преобразовывать с проверкой на ошибки
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Angie |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.7.2003 Репутация: нет Всего: нет |
Спасибо за советы, но если у меня числа не до 10, а больше, т.е. дву- и более значные? Тогда использование символа не проходит. Именно поэтому и использовался численный тип. Как быть?
|
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
в этом случае используется строка символов и тоже преобразовывается с проверкой на ошибки
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Angie |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.7.2003 Репутация: нет Всего: нет |
2Step: А без строки никак не извратнуться?
2Mellorn: Твой код у меня чего-то немного глючит (это если не считать отсутствие обработки двузначных чисел). К нужному кейсу выводит еще и дефалт (всегда). Бряк вроде бы нигде не забыт. |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
Angie, от пользователя трудно извернуться, они твою прогу заглючить смогут даже если это НЕВОЗМОЖНО
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Angie |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.7.2003 Репутация: нет Всего: нет |
Мдяя..
Вот конечный вариант со строкой. Работает. 8)
Это сообщение отредактировал(а) Angie - 12.12.2003, 20:06 |
|||
|
||||
Serzh |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 30.9.2003 Где: SPb Репутация: нет Всего: нет |
ну вы народ и даете!!!!!!!!!!!!!!!!!!!!!
сама функция scanf возвращает результат - ошибка, или кол-во отсканеных значений!!! а еще сканф сканит входной поток(нажатие на клавиши) и если находит ошибку, но делает выход(из scanf) а буфер с введенными клавишами не очишает, по этому и было бесконечнjt повторение одного и того же значения. лучше использовать gets в комбинации с sscanf!!! gets(char *s) - помещает в s все что нажимается до нажатия enter sscanf(char *s, char *f, ...) - тоже, что и scanf, только работает с буфером s. а вот и текст:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |