【发布时间】:2018-06-30 02:41:34
【问题描述】:
我正在开发一个微控制器程序,并希望使用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。 谁能指出我正确的方向并解释我做错了什么?
【问题讨论】:
-
这里的真正问题是您没有将编译器警告提高到足够高以使其能够捕捉到这一点。
-
真正的问题是您没有阅读手册页 - 请参阅scanf
-
如果格式说明符与相应变量的类型不匹配,
XXXscanf()和XXXprintf()函数会给出未定义的行为。%d指定有符号整数类型,并且为相应参数提供任意大小的无符号变量会产生未定义的行为。