#include<stdio.h>
int main()
{
char a;
do {
printf("\n enter letter a,b or c: ");
scanf("%c", &a);
switch (a)
{
case 'a' :
printf("\n one \n");
break;
case 'b' :
printf("\n two \n");
break;
case 'c' :
printf("\n three \n");
break;
default:
printf("\n invalid input \n");
break;
}
}while(a != 'd');
}
этот код всегда работает по умолчанию, даже если есть перерыв;
но если вы замените %c на %s, он работает нормально, я просто хочу понять, почему использование %c делает это или есть ли другой способ заставить его работать идеально с использованием %c
также использование a=getch() работает, но я хочу отображать ввод без использования printf для его отображения
Что касается того, что происходит, я предлагаю вам использовать отладчик, чтобы увидеть, какое значение a
действительно имеют в вашем текущем коде.
Обратите внимание: scanf() оставляет символ новой строки в буфере.
«Если вы замените %c на %s, он будет работать нормально». Нет, это неопределенное поведение.
«Я хочу понять, что делает %c». Некоторое объяснение: большинство спецификаторов формата для scanf
автоматически фильтруют начальные пробелы, но %c
, %[]
и %n
этого не делают. Добавление пробела перед %
указывает scanf
фильтровать начальные пробелы и здесь. Причина в том, что эти три спецификатора позволяют вам читать каждый символ, включая пробелы, но предоставляется способ, чтобы они вели себя как %d
, %f
и %s
, где это необходимо.
Если вы хотите понять scanf
, посидите два часа с справочной страницей и небольшой тестовой программой. Не используйте кладжи, такие как a=getch()
. Они не нужны, как только вы поймете, как обрабатываются пробелы.
Подсказка: измените printf("\n invalid input \n");
на printf("\n invalid input , a= %d\n", a);
и посмотрите, что произойдет. Подсказка 2: 10
, который вы увидите, — это код клавиши Enter.
Или... просто не тратьте слишком много времени на изучение stdio.h
. Это одна из самых ужасных библиотек, когда-либо созданных, во всех категориях. В лучшем случае ее следует рассматривать как библиотеку быстрой и грязной отладки. Существует очень мало программ, которые на самом деле должны получать ввод со стандартного ввода вместо, например, параметров командной строки. В общем, почти все перестали использовать консольный ввод-вывод более 20 лет назад. Таким образом, помимо того, что она изначально и ужасно нарушена дизайном, это также совершенно неуместная библиотека для изучения при изучении современного программирования на C.
При использовании scanf вам нужно нажать клавишу ввода после буквы a/b/c, чтобы отправить ввод. %c интерпретирует ваш ввод как два символа. Один для фактической буквы, которую вы ввели, а второй для клавиши ввода. Именно этот ключевой символ ввода проходит через регистр «по умолчанию». Когда вы используете getch(), все работает нормально, потому что вы не нажимаете клавишу ввода
Я видел комментарий, в котором говорилось, что использование "%c" будет работать, и это сработало. Ничего, если вы дадите мне хоть малейшее представление о том, почему это сработало? даже без подробного объяснения, просто ключевая информация
@Vavlo — повторяющийся вопрос все объясняет. Так что сделайте некоторые комментарии.
Попробуйте вместо этого использовать
" %c"
. Обратите внимание на начальный пробел в строке формата.