Я разрабатываю программу для микроконтроллера и хочу читать цифры из строки в целочисленные переменные, используя sscanf()
. Проблема в том, что я получаю другое поведение при использовании объявлений int
по сравнению с uint8_t
или uint16_t
.
Это использует int
для объявления переменной:
#include <stdio.h>
#include <stdint.h>
int main()
{
int power;
int hr;
int cadence;
sscanf("204 67 94","%d %d %d",&power, &hr, &cadence);
printf("power: %d, hr: %d, cadence: %d", power, hr, cadence);
return 0;
}
и при вводе в https://www.onlinegdb.com/ возвращает:
power: 204, hr: 67, cadence: 94
...Program finished with exit code 0
Press ENTER to exit console.
Вот как я ожидаю, что он будет вести себя.
Принимая во внимание, что использование целых чисел uint8_t
и uint16_t
:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t power;
uint8_t hr;
uint16_t cadence;
sscanf("204 67 94","%d %d %d",&power, &hr, &cadence);
printf("power: %d, hr: %d, cadence: %d", power, hr, cadence);
return 0;
}
при вводе в https://www.onlinegdb.com/ выдает:
power: 0, hr: 67, cadence: 94
...Program finished with exit code 0
Press ENTER to exit console.
Итак, по какой-то причине мощность (или, в более общем смысле, первая переменная) установлена на 0. Может ли кто-нибудь указать мне правильное направление и объяснить, что я делаю неправильно?
XXXscanf()
иXXXprintf()
дают неопределенное поведение, если спецификатор формата не соответствует типу соответствующей переменной.%d
задает целочисленный тип SIGNED, а предоставление беззнаковой переменной любого размера для соответствующего параметра приводит к неопределенному поведению. - person Peter   schedule 21.01.2018