【问题标题】:Sscanf with hexadecimal values具有十六进制值的 Sscanf
【发布时间】:2023-03-30 11:15:01
【问题描述】:

我必须在 C++ 中解析一个具有十六进制值的 char 数组:

char test[20] = ":CF0100020003000400";

从测试中我必须获得 0200 (512)、0300 (768) 和 0400 (1024)。我想将这些值保存为 uint16_t 类型。

uint16_t value1;
uint16_t value2;
uint16_t value3;
sscanf(test, ":CF%*04x%04x%04x%04x", (int *)&value1, (int *)&value2, (int *)&value3);

我只获得了最后一个值 (value3 = 1024),但 value1 和 value2 为 0。但是,如果变量是 int,不进行强制转换,sscanf 工作正常。 ¿ 我该如何解决?

【问题讨论】:

    标签: c++ scanf


    【解决方案1】:

    您的转换和选择错误的格式说明符会导致未定义的行为。根据变量的类型使用正确的格式说明符:

    std::sscanf(test, ":CF%04" SCNx16 "%04" SCNx16 "%04" SCNx16,
                          &value1,     &value2,     &value3);
    

    【讨论】:

    • 我在 IAR 中编译,这个解决方案给出了一个错误:预期一个“)”。我想它无法识别 SCNx16 宏。
    • @user1799803 是否包含定义宏的标头?
    • 是的,我已经包含了它。最后我发现我的编译器的 SCNx16 是“h”所以这条线有效: sscanf(test, ":CF%*04hx%04hx%04hx%04hx", &value1, &value2, &value3);
    • @user1799803 我想你的标准库不符合 C++11。只要您的程序不需要移植到其他系统,使用hx 应该可以工作。
    • @user1799803 : 编译器错误 "expected a ")" " 可能意味着您不小心在引号之后和 SCNx16 宏之前输入了一个逗号(并且您的编译器正在检查 scanf 字符串的有效性以下论点)。
    猜你喜欢
    • 2013-01-26
    • 2012-04-29
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2018-07-26
    • 2017-03-11
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多