【问题标题】:matching trailing text in sscanf?匹配sscanf中的尾随文本?
【发布时间】:2016-12-19 11:31:23
【问题描述】:

这与 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 或类似操作的情况下匹配尾随文本?

【问题讨论】:

  • @user3121023:很好!将其发布为答案。

标签: c scanf


【解决方案1】:

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

建议使用" %n" 以允许可选的尾随空格(如'\n')通过"V2X_3_expected\n" 并检查%n 结果以失败"V2X_3_expected 123"

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" 等短格式。

【讨论】:

    【解决方案2】:

    scanf 的返回语句告诉你他成功的分配次数所以如果你要求一个“填充”

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

    scanf 成功返回值为 1;

    所以这很正常。

    您可以找到更多关于使用命令行man scanf的文档

    【讨论】:

    • 不幸的是,这个答案是绝对正确的,完全没用。
    • 我的问题我没听懂
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2018-12-14
    相关资源
    最近更新 更多