我目前正在阅读本书“初学者的C11编程”,并在scanf()章节中说:
“始终在第一个控制字符串字符前添加前导空格,以确保准确的字符输入。”如:
scanf(" %s", whatever);
控制字符串%s,前面有一个空格。 我知道这听起来很不言自明,但我不知道会出现什么问题,以及这个空间如何确保准确的字符输入。
提前致谢。
答案 0 :(得分:4)
"%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
)留下的任何尾随字符。