22
#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”。然后它只打印了一次“jo”。)

4

7 回答 7

23

从我的 scanf 手册页

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

因此,scanf ("%s\n", a)它将扫描一个字符串,后跟可选的空格。由于在第一个换行符之后可能会出现更多空格,因此 scanf 不会在第一个换行符之后完成,而是查看接下来的内容。您会注意到您可以输入任意数量的换行符(或制表符或空格),而 scanf 仍将等待更多。

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

用于scanf ("%s", a)不扫描尾随空格。

于 2013-04-01T08:30:37.697 回答
12

您必须\nscanf. 它应该是

scanf("%s",a);

编辑:解释

%s意味着 scanf 读取输入字符,直到它得到一个分隔符,该分隔符应该是一个空格,如空格或制表符或换行符(\n),所以第一个输入是作为分隔符获取的,"%s"并且添加"\n"到字符串格式"%s\n"意味着scanf 将等待 2 个换行符,第一个换行符与 the 的分隔符有关,"%s"第二个换行符与\n字符串格式的 the 有关。

于 2013-04-01T08:24:49.903 回答
0

使用 gets() 或 fgets() 代替...或者使用 scanf("%[^\n]s",a);

于 2013-04-01T08:25:09.477 回答
0

从 scanf 格式中删除\n并给出一个输入,它会根据给定的输出显示一次输出。

于 2017-05-30T14:42:34.327 回答
0

您可以使用其中任何一个来避免上述问题: scanf("%s",a);scanf("\n%s",a);

于 2019-05-11T12:30:33.893 回答
0

试试这个:不要在 scanf 上使用 \n,它不会问你两次,有时它可能会显示错误

你的代码scanf("%s\n", a);

在 scanf 上试试这个scanf("%s", a);

于 2021-02-20T14:48:25.227 回答
-1

不要在 scanf stdio 函数中使用转义序列

     scanf ("%s", a);
于 2016-10-06T04:17:30.243 回答