为什么建议在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
中的任何尾随字符。