为什么建议在scanf格式字符串中添加前导空格?
我目前正在读这本书“C11初学者编程”,在scanf()一章中,它说: “始终在第一个控制字符串前添加前导空格,以确保准确的字符输入。”如: 控制字符串%s前面有一个空格。 我知道这听起来不言自明,但我真的不知道会出什么问题,以及这个空间如何确保准确的字符输入 提前感谢。“始终在第一个控制字符串前添加前导空格,以确保准确的字符输入。”为什么建议在scanf格式字符串中添加前导空格?,c,string,controls,scanf,C,String,Controls,Scanf,我目前正在读这本书“C11初学者编程”,在scanf()一章中,它说: “始终在第一个控制字符串前添加前导空格,以确保准确的字符输入。”如: 控制字符串%s前面有一个空格。 我知道这听起来不言自明,但我真的不知道会出什么问题,以及这个空间如何确保准确的字符输入 提前感谢。“始终在第一个控制字符串前添加前导空格,以确保准确的字符输入。” 这是在scanf读取用户输入之前,使用先前用户输入可能留下的stdin中的任何尾随字符(如回车)。它既没有理性,也没有细节。此外,它不适用于“%s”,因为“%s”
这是在
scanf
读取用户输入之前,使用先前用户输入可能留下的stdin
中的任何尾随字符(如回车
)。它既没有理性,也没有细节。此外,它不适用于“%s”
,因为“%s”
使用带或不带前导空格的前导空格
char ch;
scanf(" %c", &ch);
前导空格,无论是'
,'\t'
,'\n'
,等等。所有这些都做同样的事情:直接scanf()
使用和不存储可选的前导空格char
。这很有用,因为previousscanf()
的典型用法不会使用用户的'\n'
输入
所有scanf()
输入说明符都忽略前导空格,除了3:%c“
,%n”
,“%[]”
简单指令确实有利于引导空间,如下所示。在“$”
之前消耗上一个剩余的空白
int Money;
scanf(" $%d", &Money);
通常,虽然在之前不总是有前导空格,但在读取用户输入的单个字符时,%c“
是有益的
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()
,这通常是这样的情况。最好附带一个大警告单字符%c
抓取可能是这个大锤式语句背后的主要原因,没有提供这样的细节让我对该文本中的巫毒教思想产生了质疑。如果没有解释为什么你应该遵循这个咒语,以及如果你不遵循这个咒语,事情怎么会出差错,那么“总是这样做”往往会让人困惑而不是有所帮助(例如,你发布这个问题…)。不管怎样,你可能会发现这本书很有用。那本书真的叫做C11初学者编程吗?在C11中,scanf
不是被scanf_s
取代了吗?谢谢chux:)据我所知,当scanf()与“%c”、“n”或“%[]”一起使用时,scanf将在字符中存储前导空格。如果一个字符只能容纳一个字符,它如何存储在同一个字符中?@Stanleyscanf(“%c”,&ch)代码>将使用并丢弃可选的前导空格。然后将在ch
中存储一个非空白char
<代码>扫描频率(“%c”和“ch”)
将存储进入ch
的第一个char
<代码>%n“
或“%[]”
的工作方式完全不同。回答得非常好,感谢您为本网站所做的努力!
char buf[30];
int cnt = scanf("%29s", buf);
if (cnt != 1) Handle_NoInput_or_EOF_IOError();