【问题标题】:sscanf %u not intepreting hexadecimalsscanf %u 不解释十六进制
【发布时间】: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 更好,但如果有疑问,标准是最好的。

标签: c c99 scanf iar


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2019-09-19
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多