Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> А если буква вместо цифры? странное поведение программы 
:(
    Опции темы
Angie
Дата 12.12.2003, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.7.2003

Репутация: нет
Всего: нет



Приветствую и сразу к делу.
Есть небольшая простенькая программка, функция которой заключается в выводе определенного значения по вводимому ключу. Ключ - целое число. Но самое странное и непонятное (для меня) то, что выводит программа, если ввести не цифру.
Код программы:
Код

#include <stdio.h>
int main()
   {
   int number;
   scanf("%d",&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("%d",&number);
printf("\n\n");
}
return 0;
   }


Если ввести на запрос не цифру, а любой другой символ то получаю бесконечный вывод предыдущего результата. Все это понятно, то там же scanf()!!!(второй). Почему программа не останавливается перед ним?
И еще: как тогда исключить такую ситуацию? Разве значения default не достаточно для перехвата неправильно введенного значение, какое оно бы ни было?
Заранее спасибо.
PM MAIL   Вверх
Step
Дата 12.12.2003, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



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


но я моги и ошибаться


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Mellorn
Дата 12.12.2003, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}

PM MAIL   Вверх
Step
Дата 12.12.2003, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



вот именно так и ты будешь застрахован от ошибок, и считается правилом хорошего тона все данные с клавы вводить в символьном виде, а потом преобразовывать с проверкой на ошибки


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Angie
Дата 12.12.2003, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.7.2003

Репутация: нет
Всего: нет



Спасибо за советы, но если у меня числа не до 10, а больше, т.е. дву- и более значные? Тогда использование символа не проходит. Именно поэтому и использовался численный тип. Как быть?
PM MAIL   Вверх
Step
Дата 12.12.2003, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



в этом случае используется строка символов и тоже преобразовывается с проверкой на ошибки


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Angie
Дата 12.12.2003, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.7.2003

Репутация: нет
Всего: нет



2Step: А без строки никак не извратнуться?

2Mellorn: Твой код у меня чего-то немного глючит (это если не считать отсутствие обработки двузначных чисел). К нужному кейсу выводит еще и дефалт (всегда). Бряк вроде бы нигде не забыт.
PM MAIL   Вверх
Step
Дата 12.12.2003, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Angie, от пользователя трудно извернуться, они твою прогу заглючить смогут даже если это НЕВОЗМОЖНО


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Angie
Дата 12.12.2003, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.7.2003

Репутация: нет
Всего: нет



Мдяя..
Вот конечный вариант со строкой. Работает. 8)
Код
#include <stdio.h>
#include <string.h>
int main()
{
int number;
char str[16];
while(1)
{
 scanf("%s", str);
 
 if (!strcmp(str, "0"))
  break;

 number = atoi(str);
 printf("\n\n");

 printf("You've entered the key that is related to the value named - ");
 switch(number)
 {    
 case 1: printf("a.\n\n"); break;
 case 2: printf("b.\n\n"); break;
 case 3: printf("c.\n\n"); break;
 case 4: printf("d.\n\n"); break;
 case 5: printf("e.\n\n"); break;
 case 6: printf("f.\n\n"); break;
 case 7: printf("g.\n\n"); break;
 case 8: printf("h.\n\n"); break;
 case 9: printf("i.\n\n"); break;
 case 10: printf("j.\n\n"); break;
 case 11: printf("k.\n\n"); break;
 case 12: printf("l.\n\n"); break;
 default: printf("noname. No such value.\n\n"); break;
 }
 printf("Any more tries? Enter the key, or type '0' for exit: ");
}

return 0;
}


Это сообщение отредактировал(а) Angie - 12.12.2003, 20:06
PM MAIL   Вверх
Serzh
Дата 13.12.2003, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 30.9.2003
Где: SPb

Репутация: нет
Всего: нет



ну вы народ и даете!!!!!!!!!!!!!!!!!!!!!
сама функция scanf возвращает результат - ошибка, или кол-во отсканеных значений!!!
а еще сканф сканит входной поток(нажатие на клавиши) и если находит ошибку, но делает выход(из scanf) а буфер с введенными клавишами не очишает, по этому и было бесконечнjt повторение одного и того же значения.
лучше использовать gets в комбинации с sscanf!!!
gets(char *s) - помещает в s все что нажимается до нажатия enter
sscanf(char *s, char *f, ...) - тоже, что и scanf, только работает с буфером s.

а вот и текст:
Код

#include <stdio.h>

int main(void)
{
char s[100];
int i=1;
int res;
printf("Введите число или 0 для выхода\n");
while (i>0)
 {
   gets(s);
   res = sscanf(s, "%d", &i);
   if (res == 0) printf("Введите число!!!\n"); else
   switch (i)
   {
     case 1:printf("a\n");break;
     case 2:printf("b\n");break;
     case 3:printf("c\n");break;
     case 4:printf("d\n");break;
     case 5:printf("e\n");break;
     default:printf("noname\n");
   }
 }

return 0;
}


PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0850 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.