为什么scanf匹配不同的字符串结尾

Why does scanf matches different string ends

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

#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='[=10=]';
    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 到 '.'然后忽略其余部分,我如何区分结尾?

sscanf returns 它分配的输入项数(除了,如果在第一次转换完成之前发生输入失败,它 returns EOF).在sscanf("A_BB_CCC_123.NO", "%[^.].YES", S);中,“A_BB_CCC_123”匹配并赋值给S。然后 ”。”火柴。然后“YES”不匹配“NO”,所以sscanf停止并且returns它分配的项目数,这是一个。

如果想知道是否匹配到了字符串的末尾,可以在末尾使用%n来请求统计消耗的输入字符数。如果它从您初始化的计数更改为,则 sscanf 到达终点:

    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 return 的赋值计数中;它仍然 return 只是 1,对于 %[ 转换。)