为什么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,对于 %[
转换。)
为什么这两种情况都匹配?
#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,对于 %[
转换。)