为什么';t scanf是否使用非空白字符跟踪文档?

为什么';t scanf是否使用非空白字符跟踪文档?,c,scanf,C,Scanf,表示格式中的任何“非空白字符”都会导致函数从流中读取下一个字符,将其与此非空白字符进行比较,如果匹配,则丢弃该字符,函数继续使用格式的下一个字符如果字符不匹配,则函数失败,返回流中的后续字符并使其未读。 但是,如果我运行: int x; while(scanf("\n%d",&x)==1) printf("%d\n",x); 通过以下输入: 1 2 它打印: 1 2 既然这两个数字的任何一个前面都没有“\n”,scanf为什么要读取它们?这不符合文档吗?\n是一个空白字符。请参见您

表示格式中的任何“非空白字符”都会导致函数从流中读取下一个字符,将其与此非空白字符进行比较,如果匹配,则丢弃该字符,函数继续使用格式的下一个字符如果字符不匹配,则函数失败,返回流中的后续字符并使其未读。

但是,如果我运行:

int x;
while(scanf("\n%d",&x)==1) printf("%d\n",x);
通过以下输入:

1 2
它打印:

1
2

既然这两个数字的任何一个前面都没有“\n”,scanf为什么要读取它们?这不符合文档吗?

\n
是一个空白字符。请参见您链接到的同一页上以及您引用的段落之前的,我看到:

  • 空白字符:函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——请参阅isspace)。格式字符串中的单个空白验证从流中提取的任何数量的空白字符(包括无)
\n
是一个空白字符

因此,呼吁

scanf("\n%d",&x)

在将数据读入
&x

之前,将从
stdio
中提取并丢弃任意数量的空格字符。换行符被视为空格,被scanf忽略。您是否阅读了有关scanf如何处理格式中的空格的部分?谢谢,收到了。空白字符部分不仅包括,而且包括任何“空白类型字符”,其中包括新行。如何将问题标记为已解决?“如何将问题标记为已解决?”-您可以接受AShelly回答您问题的答案;)甚至不需要放置
“\n%d”
,因为
%d
格式无论如何都会忽略前导空格<代码>%d足够了。