为了账号安全,请及时绑定邮箱和手机立即绑定

当格式字符串的末尾有一个换行符时,扫描为什么要求两次输入?

当格式字符串的末尾有一个换行符时,扫描为什么要求两次输入?

C
守候你守候我 2019-07-01 10:40:18
当格式字符串的末尾有一个换行符时,扫描为什么要求两次输入?#include <stdio.h>#include <stdlib.h>#include <string.h>char *method1(void){     static char a[4];     scanf("%s\n", a);     return a;}int main(void){     char *h = method1();     printf("%s\n", h);     return 0;}当我运行上面的代码时,提示是问我两次用于输入(我只使用scanf一次在代码中)。那是为什么?(我输入了“Jo”,它要求更多的输入,所以我又输入了“Jo”。然后它只印了一次“乔”。)
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

从我的扫描手册页

格式字符串中的空白(如空格、制表符或换行符)与输入中任何数量的空白(包括无空白)匹配。其他的一切都只匹配自己。

因此.scanf ("%s\n", a)它将扫描一个字符串,后面跟着可选的空格。因为在第一个换行符之后可能会有更多的空格,扫描在第一个换行符之后不会被完成,然后查看下一步是什么。您会注意到,您可以输入任意数量的换行符(或制表符或空格),而扫描仍将等待更多。

但是,当您输入第二个字符串时,空格序列将被分隔并停止扫描。

使用scanf ("%s", a)若要不扫描尾随空格,请执行以下操作。


查看完整回答
反对 回复 2019-07-01
?
holdtom

TA贡献1805条经验 获得超10个赞

您必须移除\n的字符串格式scanf..应该是

scanf("%s",a);

编辑:解释

这个%s意味着扫描器读取输入字符,直到得到一个分隔符,该分隔符应该是空格、制表符或新行(\n)的第一个输入作为分隔符。"%s"并添加"\n"到字符串格式"%s\n"表示扫描将等待2条换行符,第一条换行符与"%s"第二条换行符与\n字符串格式。


查看完整回答
反对 回复 2019-07-01
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

"%[^\n]s"由两个指令组成:%[^\n],它要么匹配(并存储)一个或多个非‘\n’字符,要么失败,因为它立即遇到‘\n’,并且s它匹配一个文字的‘并丢弃它,或者失败并将非’s‘字符推回stdin。第一个指令将连续尝试失败,因为‘\n’不是‘s’,所以‘\n’将直接推回stdin,这是遇到的第一个字符。你自己看看:char a[64]; int n = scanf("%[^\n]s", a); assert(n == 1); n = scanf("%[^\n]s", a); assert(n == 1);

查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 616 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信