Спецификатор преобразования %d
в этом вызове
scanf("%d", &ch);
недопустим. Он пытается прочитать число. Поэтому ввод буквы типа «А» приводит к ошибке ввода.
Компилятор может выдать предупреждение или даже сообщение об ошибке, которое, например,
в формате «% d» ожидает аргумент введите 'int *', но аргумент 2 имеет тип 'char *'
Поскольку использование недопустимого формата может привести к неопределенному поведению.
Вот демонстрационная программа
#include <stdio.h>
int main(void)
{
char s[] = "ABCD";
puts( s );
scanf( "%d", ( int * )s );
puts( s );
return 0;
}
Если, например, даже ввести действительный код ASCII, например, 65
буквы 'A'
, то вывод программы может выглядеть следующим образом:
ABCD
A
То есть память, занятая массив был перезаписан.
Вместо этого используйте следующий вызов. (если вы хотите пропустить пробелы)
scanf( " %c", &ch );
или следующий вызов
scanf( "%c", &ch );
Обратите внимание на согласно стандарту C функция main без параметров должна быть объявлена как
int main( void )