匹配sscanf中的尾随文本?

时间:2016-12-19 11:31:23

标签: c scanf

这与sscanf usage - how to verify a completed scan vs an aborted scan有关,但它是该问题未涵盖的边缘情况。

char entry[] = "V2X_3_accepted";
int d1,d2,ret1,ret2;
ret1 = sscanf(entry,"V2X_%d_expected",&d1);
ret2 = sscanf(entry,"V2X_%d_received",&d2);

预期结果:ret1==0; ret2==0; d1, d2未定义。

实际结果:ret1==1; ret2==1; d1=d2=3

最后使用%n不会有帮助,因为匹配字符串的长度相等。是否有一些巧妙的技巧来匹配尾随文本而不执行连续的strncmp或类似的?

2 个答案:

答案 0 :(得分:2)

使用"%n"工作正常。 @user3121023

建议使用" %n"允许'\n'之类的可选尾随空格传递"V2X_3_expected\n"并检查%n结果失败"V2X_3_expected 123"。< / p>

char entry[] = "V2X_3_accepted";

int d1,d2;
int n1 = 0;
int n2 = 0;

sscanf(entry,"V2X_%d_expected %n",&d1, &n1);
sscanf(entry,"V2X_%d_received %n",&d2, &n2);
if (n1 > 0 && entry[n1] == '\0') Success_expected(d1);
else if (n2 > 0 && entry[n2] == '\0') Success_received(d2);
else Fail(entry);

n1初始化为永远不会设置的值,扫描到达"%n"说明符。 n1 = 0;在大多数情况下运行良好,例如OP的格式"V2X_%d_ ..."

n1 = -1; /* and (n1 >= 0 */也适用于" %n"等短格式。

答案 1 :(得分:-2)

scanf的返回陈述告诉你他成功的分配数量,如果你要求一个“填充”

ret1 = sscanf(entry,"V2X_%d_expected",&d1);

和scanf成功返回值将为1;

所以这是完全正常的。

您可以找到有关使用命令行man scanf

的更多文档