1

我正在尝试使用sscanf. 结果不正确,对于值 0x01,sscanf返回一个 0 (0)。

根据C++ Reference,“%u”说明符的定义(突出显示是我的):
i, u Integer 任意数量的数字,可选地以符号(+或-)开头。默认采用十进制数字 (0-9),但 0 前缀引入八进制数字 (0-7)和 0x 十六进制数字 (0-f)

根据 Harbison & Steele,第 3 版:
u 转换 执行无符号十进制转换。strtol...读取的数字格式与参数值为 10的函数输入的预期格式相同base;这是一个十进制数字序列,可选地以 - 或 + 开头。

请注意,其中一个定义允许在字符串中指定“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;
}
4

1 回答 1

4

根据当前的 C 标准,C11, 7.21.6.2/12 仅从%i上下文中推导出基数,所有其他说明符固定基数:

istrtol匹配一个可选带符号的整数,其格式与函数主题序列的预期格式相同,参数值为 0 base。相应的参数应该是一个指向有符号整数的指针。

ostrtoul匹配可选带符号的八进制整数,其格式与函数主题序列的预期格式相同,参数值为 8base。相应的参数应该是一个指向无符号整数的指针。

ustrtoul匹配可选带符号的十进制整数,其格式与函数主题序列的预期格式相同,参数值为 10base。相应的参数应该是一个指向无符号整数的指针。

xstrtoul匹配可选带符号的十六进制整数,其格式与函数主题序列的预期格式相同,参数值为 16base。相应的参数应该是一个指向无符号整数的指针。

于 2013-09-23T22:03:12.847 回答