C语言 为什么 sscanf %n 格式说明符对返回值没有影响?



下面的 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函数的执行。

最新更新