Это потому, что %d
ожидает указатель на 4-байтовое целое число, и вы передаете указатель на 1-байтовый char
. Поскольку переменные a
, b
и c
хранятся в порядке убывания адресов памяти, sscanf
сначала заполняет a
с 23, в то же время заполняя 3 других байта памяти стека нулями (это нарушение памяти, BTW). Затем он заполняет b
с 13, также заполняя a
и два других байта с нулями. В конце он заполняет c
с 45, также заполняя a
и b
и еще один байт с нулями. Таким образом, вы получаете нули в b
и a
, а ожидаемое значение - только в c
.
Конечно, это только один возможный сценарий того, что может произойти, поскольку это зависит от архитектуры и компилятора.
Правильный способ чтения 4 целых чисел состоял бы в том, чтобы использовать int
вместо unsigned char
или изменить спецификатор формата.
Почему% d является неправильным? Я знаю, что int больше, чем char. – user3072005
Для '% d' sscanf() ожидает' подписанный int * ', но вы передаете указатели на' unsigned char', который является [неопределенным поведением] (http://en.wikipedia.org/wiki/Undefined_behavior). –