为什么建议在scanf格式字符串中添加前导空格?

我目前正在阅读这本书“初学者的C11编程”,并在scanf()章节中说:

“始终在第一个控制字符串字符前添加前导空格,以确保准确的字符输入。” 如:

scanf(" %s", whatever); 

控制字符串%s,前面有一个空格。 我知道这听起来很不言自明,但我并没有真正得到可能出错的地方,以及这个空间如何确保准确的字符输入。

提前致谢。

@WhozCraig很好地说明了这个建议的缺点。 它没有理性也没有细节。 此外,它不适用于"%s"因为"%s"消耗带有或不带前导空格的前导空格。

一个领先的白色空间,无论是' ''\t''\n'等都做同样的事情:直接scanf()消费而不存储可选的前导空白char 。 这很有用,因为之前的scanf()典型用法不会消耗Enter中用户的'\n'

 scanf("%d", &some_int); scanf("%c", &some_char); // some_char is bound to get the value '\n' 

所有scanf()输入说明符都忽略前导空格,除了3: "%c""%n""%[]"

Simply指令确实有利于领先空间,如下所示。 之前的剩余空白空间在'$'之前消耗。

 int Money; scanf(" $%d", &Money); 

通常,尽管并非总是在"%c"之前的前导空间是有益的,因为当读取用户输入的单个char时。

 char ch; scanf(" %c", &ch); 

建议最大的问题是1)使用"%s" ,提供宽度参数对于健壮的代码至关重要; 2)应检查返回值。

 char buf[30]; int cnt = scanf("%29s", buf); if (cnt != 1) Handle_NoInput_or_EOF_IOError(); 

最后,建议在scanf()上使用fgets() ,因为通常就是这种情况。

“始终在第一个控制字符串字符前添加前导空格,以确保准确的字符输入。”

这是在scanf读取用户输入之前,使用先前用户输入(如carriage return )可能留下的stdin中的任何尾随字符。