Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sscanf-读取十六进制值赢得';我不能用逗号_C_Scanf - Fatal编程技术网

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)变量中包含无效数据。