为什么sscanf读取的内容比预期多?

4

sscanf 支持使用 %n 来计算读取了多少个字节。

为什么有时候 sscanf 会读取额外的字节?

#include <stdio.h>

int main()
{
    char *data = "X\n \n\x09\n \x10\n";
    int len = 0;

    sscanf(data, "X%n", &len);
    printf("%i\n", len);

    sscanf(data, "X\n%n", &len);
    printf("%i\n", len);

    return 0;
}

这个程序会输出:
1
7

我希望:

1
2

(X代表1,X\n代表2.)

为什么读取的字节数比预期的多?


6
对于scanf函数系列来说,所有的空白字符都是相等的。在scanf的格式字符串中放置一个空格将导致它跳过所有连续的空格。 - Some programmer dude
1
@Someprogrammerdude。scanf函数族中所有的空格都是相等的,除了"%[....]"内部的空格。 - chux - Reinstate Monica
1个回答

2

来自 cppreference:

格式字符串 由以下内容组成:

  • 非空格多字节字符(除了 %):格式字符串中的每个此类字符都会从输入流中精确地消耗一个相同的字符,或者如果流中的下一个字符不相等,则导致函数失败。

  • 空格字符:格式字符串中的任何单个空格字符都会从输入中消耗所有可用的连续空格字符(如通过调用循环中的 isspace 确定)。请注意,在格式字符串中没有 "\n"、" "、"\t\t" 或其他空格的区别。

因此,第二个格式字符串中的 \n 会使函数消耗所有剩余的空白字符——实际上是处于 X0x10 之间的所有6个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接