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

时间:2014-10-15 20:24:51

标签: c string controls scanf

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

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

scanf(" %s", whatever);

控制字符串%s,前面有一个空格。 我知道这听起来很不言自明,但我不知道会出现什么问题,以及这个空间如何确保准确的字符输入。

提前致谢。

2 个答案:

答案 0 :(得分:4)

@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""%[]"除外。

简单指令受益于前导空格,如下所示。之前的剩余空白空间在'$'之前消耗。

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();

最后,建议尽可能使用fgets()而不是scanf() - 通常就是这种情况。

答案 1 :(得分:1)

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

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