当格式字符串末尾有换行符时,为什么scanf要求输入两次?
#include #include #include 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’。然后它只打印出’jo’一次。)
从我的scanf手册页
格式字符串中的空格(如空格,制表符或换行符)在输入中匹配任意数量的空格,包括无空格。 其他一切只与自己匹配。
因此,对于scanf ("%s\n", a)
,它将扫描一个字符串,后跟可选的空格。 由于在第一个换行符之后可能会出现更多的空格,因此在第一个换行符之后不会执行scanf并查看下一个换行符。 您会注意到您可以输入任意数量的换行符(或制表符或空格),scanf仍会等待更多。
但是,当您输入第二个字符串时,将分隔空格序列并停止扫描。
使用scanf ("%s", a)
不扫描尾随空格。
你必须从scanf
的字符串格式中删除\n
。 它应该是
scanf("%s",a);
编辑:解释
%s
表示scanf读取输入字符,直到它得到一个分隔符,该分隔符应该是空格或制表符或新行( \n
)之类的空格,因此第一个输入是作为"%s"
的分隔符获取并添加字符串格式"%s\n"
表示scanf将等待2个换行符,第一个换行符与"%s"
的分隔符相关,第二个换行符与字符串的\n
有关格式。
使用gets()或fgets()代替…或者使用scanf(“%[^ \ n] s”,a);
不要在scanf stdio函数中使用转义序列
scanf ("%s", a);
从scanf格式中删除\n
并输入一个输出,它会根据给定的输出显示一次输出。