sscanf-读取的十六进制值不适用于逗号

问题描述 投票:1回答:2

我正尝试跳过字符串并解析两个值,如下面的代码所示:

int main()
{
    char format[] = "%*s HEX_DATA:%04x, NEGATIVE_VAL:%d";
    char str[] = "text_to_be_skipped, HEX_DATA:d800, NEGATIVE_VAL:-20";

    uint16_t hex_data = 0;
    int8_t neg_val = 0;

    int status = sscanf(str, format, &hex_data, &neg_val);

    printf("Status: %d, HEX_DATA: %04x, NEGATIVE_VAL: %d", status, hex_data, neg_val);

    return 0;
}

它返回以下输出:

Status: 2, HEX_DATA: ffff, NEGATIVE_VAL: -20

十六进制值是错误的。除去,中的format[]时,输出如下:

Status: 1, HEX_DATA: d800, NEGATIVE_VAL: 0

现在hex_data值已正确解析,但未解析neg_val。如何全部解析?

c scanf
2个回答
1
投票

您应该使用%*[^,],忽略直到第一个逗号(包括第一个逗号)的字符,而不是使用%*s

此外,%04x需要写入(un)signed int,而不是uint16_t,并且%d需要写入(signed) int,而不是int8_t。使用hhh类型修饰符分别写入较小的类型。

请参见this reference以获取更多详细信息。

尝试以下方法:

int main()
{
    char format[] = "%*[^,], HEX_DATA:%4hx, NEGATIVE_VAL:%hhd";
    char str[] = "text_to_be_skipped, HEX_DATA:d800, NEGATIVE_VAL:-20";

    uint16_t hex_data = 0;
    int8_t neg_val = 0;

    int status = sscanf(str, format, &hex_data, &neg_val);

    printf("Status: %d, HEX_DATA: %04x, NEGATIVE_VAL: %d", status, hex_data, neg_val);

    return 0;
}

输出:

Status: 2, HEX_DATA: d800, NEGATIVE_VAL: -20

Live Demo


0
投票

问题是您的数据类型与格式字符串不匹配-x用于读取一个无符号的int,而不是uint16_t,d用于一个int,而不是int8_t。尝试

char format[] = "%*s HEX_DATA:%04"SCNx16", NEGATIVE_VAL:%"SCNd8;
© www.soinside.com 2019 - 2024. All rights reserved.