我正在尝试使用sscanf
的“%u”格式说明符将十六进制或十进制文本转换为无符号整数。结果不正确,对于值0x01,sscanf
返回0(0)。
根据C++ Reference,“%u”说明符的定义(突出显示是我的):
i,u Integer任意数量的数字,可选地以符号(+或 - )开头。
默认采用十进制数字(0-9),但0前缀引入八进制数字(0-7),和0x十六进制数字(0-f)。
根据Harbison&斯蒂尔,第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;
}
答案 0 :(得分:3)
根据当前的C标准C11,7.21.6.2/12,只有%i
从上下文中推断出基数,所有其他说明符都修复了基数:
i
匹配可选的有符号整数,其格式与预期的相同 对于strtol
函数的主题序列,其中值为0base
参数。相应的参数应该是指向签名的指针 整数。
o
匹配可选的带符号八进制整数,其格式与 期望strtoul
函数的主题序列具有值8 对于base
参数。相应的参数应该是指向 无符号整数。
u
匹配可选的带符号十进制整数,其格式与 期望strtoul
函数的主题序列具有值10 对于base
参数。相应的参数应该是指向 无符号整数。
x
匹配可选的带符号十六进制整数,其格式相同 正如预期的strtoul
函数的主题序列具有值 16为base
参数。相应的参数应该是指向 无符号整数。