当格式字符串末尾有换行符时,为什么scanf要求输入两次?

joy*_*joy 16 c scanf

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,提示符要求我两次输入(我只scanf在代码中使用一次).这是为什么?

(我输入'jo';它要求更多输入,所以我再次输入'jo'.然后它只打印出'jo'一次.)

Jen*_*ens 19

从我的scanf手册页

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

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

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

使用scanf ("%s", a)不扫描尾随空白.


MOH*_*MED 9

你必须\n从字符串格式中删除scanf.它应该是

scanf("%s",a);
Run Code Online (Sandbox Code Playgroud)

编辑:解释

%s意味着scanf读取输入字符,直到它得到一个分隔符,该分隔符应该是空格或制表符或新行(\n)的空白区域,因此第一个输入是作为分隔符获取"%s"并添加"\n"到字符串格式"%s\n"意味着scanf将等待2个换行符,第一个换行符与该分隔符相关,"%s"第二个换行符与\n字符串格式相关.

  • 你是在正确的轨道上,但你没有说过`scanf`将继续读取空白区域,直到遇到非空格字符.您可以在输入非空格之前输入许多新行(以及空白或制表符)并停止`scanf`.在`scanf()`的文件I/O变体上更喜欢`fgets()`和`sscanf()`的另一个原因. (2认同)