Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > А если буква вместо цифры?


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

#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 не достаточно для перехвата неправильно введенного значение, какое оно бы ни было?
Заранее спасибо.

Автор: 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)
Код
#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;
}

Автор: Serzh 13.12.2003, 02:01
ну вы народ и даете!!!!!!!!!!!!!!!!!!!!!
сама функция 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;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)