【问题标题】:Why does scanf matches different string ends为什么scanf匹配不同的字符串结尾
【发布时间】:2021-10-15 22:04:46
【问题描述】:

为什么这两种情况都匹配?

#include <stdio.h>
void main(void) {
    int n; char S[256];
    n=sscanf("A_BB_CCC_123.YES", "%[^.].YES", S);
    printf("n:%d, %s\n", n, S);

    *S='\0';
    n=sscanf("A_BB_CCC_123.NO", "%[^.].YES", S);
    printf("n:%d, %s\n", n, S);
}

$ gcc tscanf.c && ./a.out 
n:1, A_BB_CCC_123
n:1, A_BB_CCC_123

在第二种情况下不应该是 n:0 吗?如果它匹配 S 到 '.'然后忽略其余的,如何区分结局?

【问题讨论】:

  • int返回类型声明main,而不是void

标签: c scanf


【解决方案1】:

sscanf 返回它分配的输入项的数量(除非在第一次转换完成之前发生输入失败,它返回EOF)。在sscanf("A_BB_CCC_123.NO", "%[^.].YES", S); 中,“A_BB_CCC_123”匹配并分配给S。然后 ”。”火柴。那么“YES”不匹配“NO”,所以sscanf停止并返回它分配的项目数,即1。

如果想知道匹配是否到了字符串的末尾,可以在末尾使用%n来请求统计输入字符的消耗。如果它从您将计数初始化为的内容发生变化,则 @​​987654327@ 已结束:

    int characters = -1;
    n = sscanf("A_BB_CCC_123.NO", "%[^.].YES%n", S, &characters);
    if (n == 1)
        if (characters != -1)
            printf("Matched all the way to the end.\n");
        else
            printf("Matched partly.\n");
    else
        printf("Did not match anything.\n");

%n 的赋值不包括在 sscanf 返回的赋值计数中;对于 %[ 转换,它仍将仅返回 1。)

【讨论】:

  • 这有点令人费解,但可以!谢谢
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多