Это довольно запутанная ситуация. Когда дело доходит до смешивания значений char
и int
(как вы могли бы это делать при исследовании числовых значений символов в наборе символов), оказывается, что правила для scanf
и printf
почти полностью различаются.
Сначала давайте посмотрим на строки scanf
:
char a,b;
scanf("%d",&a);
scanf("%d",&b);
Одним словом, это неправильно. Формат %d
в scanf
предназначен для сканирования int
значений * только 1014 * . Вы не можете использовать %d
для ввода значения типа char
. Если вы хотите ввести символ, формат для него будет %c
(хотя он будет вводиться как символ, а не число).
Так что вам нужно изменить его на
char a,b;
scanf("%c",&a);
scanf("%c",&b);
Теперь вы можете вводить такие символы, как A
и $
и 3
и читать их в ваши char
переменные a
и b
. (На самом деле, у вас возникнут дополнительные проблемы, если вы нажмете клавишу Return между вводом символов для a
и b
, но это другая история.)
Когда дело доходит до печати символову вас есть немного больше свободы. Ваши строки
printf("%c",a);
printf("%c",b);
в порядке. И если вы хотите увидеть целочисленные значения набора символов, связанные с символами, вы могли бы набрать
printf("%d",a);
printf("%d",b);
, и это тоже сработало бы. Это происходит потому, что когда вы вызываете printf
(и другие функции, такие как он), происходят некоторые автоматические преобразования: типы char
и short int
автоматически повышаются до (передаются как) int
, а тип float
повышен до double
. Но эти автоматические преобразования происходят только для значений этих типов (как при вызове printf
). A = нет такого преобразования, когда вы передаете указатели на этих типов, как при вызове scanf
.
Что если вы хотите читать цифры, а не символы? То есть, что если вы хотите ввести число 65 и увидеть, что оно напечатано как прописная A
? Есть несколько возможных способов сделать это.
Первый способ - продолжать использовать %d
в вашем вызове scanf
, но изменить тип ваших переменных на int
:
int a,b;
scanf("%d",&a);
scanf("%d",&b);
Теперь вы можете печатать a
и b
, используя %c
или %d
, и все будет работать нормально.
Вы также можете использовать временную переменную int
перед переназначением на char
, например так:
char a,b;
int tmp
scanf("%d",&tmp);
a = tmp;
scanf("%d",&tmp);
b = tmp;
Последний, менее известный и несколько более неясный способ - использовать модификатор h
. Если вы скажете
char a,b;
scanf("%hhd",&a);
scanf("%hhd",&b);
, то теперь вы говорите scanf
: «Я хочу прочитать десятичные цифры, но целевой переменной является char
, а не int
». И, опять же, вы можете распечатать a
и b
, используя %c
или %d
, и все будет работать нормально.