sscanf-读取十六进制值赢得';我不能用逗号
我尝试跳过字符串并解析两个值,如下代码所示:sscanf-读取十六进制值赢得';我不能用逗号,c,scanf,C,Scanf,我尝试跳过字符串并解析两个值,如下代码所示: intmain() { 字符格式[]=“%*s十六进制数据:%04x,负数值:%d”; char str[]=“跳过文本,十六进制数据:d800,负值:-20”; uint16十六进制数据=0; int8_t neg_val=0; int status=sscanf(str、格式、十六进制数据和负数); printf(“状态:%d,十六进制数据:%04x,负值:%d”,状态,十六进制数据,负值); 返回0; } 它返回以下输出: Status: 2
intmain()
{
字符格式[]=“%*s十六进制数据:%04x,负数值:%d”;
char str[]=“跳过文本,十六进制数据:d800,负值:-20”;
uint16十六进制数据=0;
int8_t neg_val=0;
int status=sscanf(str、格式、十六进制数据和负数);
printf(“状态:%d,十六进制数据:%04x,负值:%d”,状态,十六进制数据,负值);
返回0;
}
它返回以下输出:
Status: 2, HEX_DATA: ffff, NEGATIVE_VAL: -20
十六进制值是错误的。当删除格式[]
中的,
时,输出如下:
Status: 1, HEX_DATA: d800, NEGATIVE_VAL: 0
现在,正确解析了
hex_数据
值,但未解析neg_val
。如何解析所有字符?与其使用%*s
,不如使用%*[^,],
忽略所有字符(包括空格),包括十六进制数据之前的第一个逗号
另外,%04x
需要一个(未)签名的int
来写入,而不是uint16
(另外,不需要前导的0
)。而%d
需要写入(签名)int
,而不是int8\t
。分别使用h
和hh
类型修饰符写入较小的类型
有关更多详细信息,请参阅
请尝试以下方法:
intmain()
{
字符格式[]=“%*[^,],十六进制数据:%4hx,负值:%hhd”;
char str[]=“跳过文本,十六进制数据:d800,负值:-20”;
uint16十六进制数据=0;
int8_t neg_val=0;
int status=sscanf(str、格式、十六进制数据和负数);
printf(“状态:%d,十六进制数据:%04x,负值:%d”,状态,十六进制数据,负值);
返回0;
}
输出:
Status: 2, HEX_DATA: d800, NEGATIVE_VAL: -20
Status: 2, HEX_DATA: d800, NEGATIVE_VAL: -20
更新:或者更好,使用
中的SCNd8
、SCNx16
、PRId8
和PRIx16
格式帮助宏,例如:
#包括
int main()
{
字符格式[]=“%*[^,],十六进制数据:%4“SCNx16”,负值:%”SCNd8;
char str[]=“跳过文本,十六进制数据:d800,负值:-20”;
uint16十六进制数据=0;
int8_t neg_val=0;
int status=sscanf(str、格式、十六进制数据和负数);
printf(“状态:%d,十六进制数据:%04“PRIx16”,负值:%”PRId8,状态,十六进制数据,负值);
返回0;
}
输出:
Status: 2, HEX_DATA: d800, NEGATIVE_VAL: -20
Status: 2, HEX_DATA: d800, NEGATIVE_VAL: -20
问题在于数据类型与格式字符串不匹配--x
用于读取无符号整数,而不是uint16\t;d
用于读取整数,而不是整数8\t。试一试
char format[] = "%*s HEX_DATA:%04"SCNx16", NEGATIVE_VAL:%"SCNd8;
同时将%04
更改为%4
,0
无效且confusing@chqrlieforyellowblockquotes:是的,它没有效果,但它没有害处--它没有效果逗号是一种骗人的东西--它与问题无关。您可以将scanf规范更改为使用%*[^,]
而不是%*s
,但它实际上与问题或问题无关。@ChrisDodd“逗号是一条红色鲱鱼”-这取决于要跳过的文本是否包含空格。显然,在给出的示例中,它没有,但我们显然不知道OP的生产代码中跳过的text\u to\u be\u的真正内容<如果代码>%*s
在逗号()之前遇到空格,它将停止解析,而%*[^,],
只有在遇到逗号()时才会停止解析。由于在HEX_DATA
之前显然有一个逗号,为了安全起见,我会选择后者。我会说它可能包含一个逗号(或不以逗号结尾),就像它包含一个空格一样——任何比示例更复杂的东西都可能是一个问题,实际上与sscanf返回明显成功的问题无关(2)变量中包含无效数据。