sscanf%你没有解释十六进制

时间:2013-09-23 22:00:11

标签: c c99 scanf iar

我正在尝试使用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;
}

1 个答案:

答案 0 :(得分:3)

根据当前的C标准C11,7.21.6.2/12,只有%i从上下文中推断出基数,所有其他说明符都修复了基数:

  

i匹配可选的有符号整数,其格式与预期的相同   对于strtol函数的主题序列,其中值为0   base 参数。相应的参数应该是指向签名的指针   整数。

     

o匹配可选的带符号八进制整数,其格式与   期望strtoul函数的主题序列具有值8   对于base 参数。相应的参数应该是指向   无符号整数。

     

u匹配可选的带符号十进制整数,其格式与   期望strtoul函数的主题序列具有值10   对于base 参数。相应的参数应该是指向   无符号整数。

     

x匹配可选的带符号十六进制整数,其格式相同   正如预期的strtoul函数的主题序列具有值   16为base 参数。相应的参数应该是指向   无符号整数。