【发布时间】:2013-09-23 22:00:11
【问题描述】:
我正在尝试使用sscanf 的“%u”格式说明符将十六进制或十进制文本转换为无符号整数。结果不正确,对于值 0x01,sscanf 返回 0 (0)。
根据C++ Reference,“%u”说明符的定义(高亮是我的):
i, u 整数 任意数量的数字,前面可选带符号(+ 或 -)。
默认采用十进制数字 (0-9),但 0 前缀引入八进制数字 (0-7)、和 0x 十六进制数字 (0-f)。
根据 Harbison & Steele,第 3 版:
u 转换 执行无符号十进制转换。
...
读取的数字格式与 strtol 函数的输入的预期格式相同,base 参数的值为 10;这是一个十进制数字序列,可选地以 - 或 + 开头。
请注意,其中一个定义允许在字符串中指定“0x”。
我正在使用 IAR EW 编译器,编译设置为 C99 方言。
哪个定义对 C99 是正确的?
我在以下程序中收到两个不同的结果。
这是一个测试程序:
#include <stdio.h>
int main(void)
{
const char text[] = "0x01 1";
unsigned int first_value = 0U;
unsigned int second_value = 0U;
signed int arguments_satisfied = 0;
arguments_satisfied = sscanf(text, "%u %u", &first_value, &second_value);
printf("Arguments scanned: %d, first: %d, second: %d\n",
arguments_satisfied, first_value, second_value);
return EXIT_SUCCESS;
}
【问题讨论】:
-
另一个不依赖 cplusplus.com 的原因(如果有必要的话)。没有尝试使用 Wayback 机器,我将 scanf 格式的规范“u/d 是十进制;x 是十六进制;o 是八进制;i 是通用的”追溯到 posix 5(1997):pubs.opengroup.org/onlinepubs/7908799/xsh/fscanf.html,但我确定它可以追溯到更远的地方。 en.cppreference.com/w 更好,但如果有疑问,标准是最好的。