У вас есть две проблемы здесь.
Прежде всего, вы звоните scanf
с %d
. Это означает, что scanf
будет искать десятичный символ и помещать его в j
. Он не найдет ничего, поэтому оставит j
без изменений.
Первое, что вам нужно сделать, это изменить %d
на %c
.
Теперь у вас есть другая проблема. j
- это int
, но вы читаете char
в него. A char
обычно меньше, чем int
. Обычно char
равен 8 битам, а int
равен 32 или 64 битам. Теперь произойдет то, что scanf
поместит значение ascii 'c'
в младший байт j
, но оставит остальное без изменений.
Вам нужно либо явно очистить j
:
int j = 0;
или объявить его как символ:
char j;
Показывает разницу между назначением int
или использованием scanf
. Функция scanf
не знает, что j
является int. Он догадывается, какие указатели были ему отправлены, на основе строки формата. Когда вы используете формат %c
, вы указываете scanf
обрабатывать &j
как указатель на символ, а если вы явно назначаете его с
j = 'c'
Компилятор знает, что 'c'
- это char
, а j
- это int
, и он сделает для вас правильное преобразование, включая обнуление старших битов.