Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么建议在scanf格式字符串中添加前导空格?_C_String_Controls_Scanf - Fatal编程技术网

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

为什么建议在scanf格式字符串中添加前导空格?,c,string,controls,scanf,C,String,Controls,Scanf,我目前正在读这本书“C11初学者编程”,在scanf()一章中,它说: “始终在第一个控制字符串前添加前导空格,以确保准确的字符输入。”如: 控制字符串%s前面有一个空格。 我知道这听起来不言自明,但我真的不知道会出什么问题,以及这个空间如何确保准确的字符输入 提前感谢。“始终在第一个控制字符串前添加前导空格,以确保准确的字符输入。” 这是在scanf读取用户输入之前,使用先前用户输入可能留下的stdin中的任何尾随字符(如回车)。它既没有理性,也没有细节。此外,它不适用于“%s”,因为“%s”

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

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

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

提前感谢。

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


这是在
scanf
读取用户输入之前,使用先前用户输入可能留下的
stdin
中的任何尾随字符(如
回车
)。它既没有理性,也没有细节。此外,它不适用于
“%s”
,因为
“%s”
使用带或不带前导空格的前导空格

char ch;
scanf(" %c", &ch);
前导空格,无论是
'
'\t'
'\n'
,等等。所有这些都做同样的事情:直接
scanf()
使用和不存储可选的前导空格
char
。这很有用,因为previous
scanf()
的典型用法不会使用用户的
'\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将在字符中存储前导空格。如果一个字符只能容纳一个字符,它如何存储在同一个字符中?@Stanley
scanf(“%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();