我正尝试跳过字符串并解析两个值,如下面的代码所示:
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
。如何全部解析?
您应该使用%*[^,],
忽略直到第一个逗号(包括第一个逗号)的字符,而不是使用%*s
。
此外,%04x
需要写入(un)signed int
,而不是uint16_t
,并且%d
需要写入(signed) int
,而不是int8_t
。使用h
和hh
类型修饰符分别写入较小的类型。
请参见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
问题是您的数据类型与格式字符串不匹配-x
用于读取一个无符号的int,而不是uint16_t,d
用于一个int,而不是int8_t。尝试
char format[] = "%*s HEX_DATA:%04"SCNx16", NEGATIVE_VAL:%"SCNd8;