下面的 sscanf 函数的返回值为 1,无论%n说明符是否存在。然而,变量n中的值会发生变化(在本例中从 0 到 5(,那么为什么函数不返回 2?
#include <stdio.h>
int main() {
int d = 0, n = 0;
char *p = "10 foo bar";
printf("%dn", sscanf(p, " %d %n", &d, &n ) );
printf("%d %dn", d, n);
return 0;
}
在我看来,这是设计使然,而不是这里的代码问题。这是因为%n不会失败,因为它只是计算读取的字符,所以以这种方式检查它是多余的吗?谢谢,我很想更多地了解这里发生了什么。
sscanf(p, " %d %n", &d, &n )
%n(下一个(是到目前为止从输入缓冲区读取的字节数。它是一个输出参数,用于指示在 sscanf 函数返回之前读取了输入缓冲区的距离。sscanf 返回值不同,表示"成功匹配的输入项数"。
您可以将%n
(以及下一个参数int n
(视为辅助输出(或返回(值。
https://linux.die.net/man/3/sscanf
到目前为止,从输入消耗的字符数通过下一个指针存储。
为您的案例提供一些示例,以查看%n
的效果(下一个指针(:
int d = 0, n = 0;
// char *p = "100 foo bar"; // 100, 6 // read upto 6 chars, parse 100
// char *p = "100foo bar"; // 100, 3 // read upto 3 chars, parse 100
// char *p = "foo100 bar"; // 0, 0 // read 0 chars, fails to parse any int
char *p = "10 foo bar"; // 10, 5 // read 5 chars, parse 10
printf("%dn", sscanf(p, " %d %n", &d, &n ) );
printf("%sn", (p + n)); // "foo bar"
来自 C99 (§7.19.6.2(:
执行
%n
指令不会递增在 完成fscanf
函数的执行。