scanf使用空格获取两行输入

scanf使用空格获取两行输入,c,scanf,C,Scanf,例如,请查找下面的代码 main() { int i; char s[100]; printf("Enter the string \n"); scanf(" %s ",s); printf("Enter the string\n"); scanf("%d",&i); printf("%s\n%d\n",s,i); } 以上代码的输出是 Enter the string hai hai Enter the string hai

例如,请查找下面的代码

main()
{
    int i;
    char s[100];
    printf("Enter the string \n");
    scanf(" %s ",s);
    printf("Enter the string\n");
    scanf("%d",&i);
    printf("%s\n%d\n",s,i);
}
以上代码的输出是

Enter the string 
hai
hai
Enter the string
hai
0
它应该接受一行输入,但也接受第二行输入。
如果删除scanf中的空格,则输出正确

有人能解释一下吗


当使用整数(%d)时,它不会发生。这是在字符串中发生的。

我们的第一次扫描等待一个字符串,该字符串在Beggining处包含一个空格,但它不存在。因此,它要求您再次输入字符串,并且在第二次输入时被接受,因为您在输入新字符串之前键入[enter]。[输入]在scanf中被视为空白

参考这个链接,看起来是一样的


您的第一个
scanf
请求一个字符串,并将跳过前导空格。
您的第二个
scanf
请求一个整数

当您输入
“hai”
时,它进入
s[]
。与
“hai”
相同,只保留
“hai”

当您输入
“jai”
时,它被解析为
int
,因此为零

除了第二个
printf
应该是

printf("Enter an integer\n");
scanf()
的手册页:

一系列空白字符(空格、制表符、换行符等;请参阅 空间(3))。此指令匹配任意数量的空白, 在输入中包括无

当格式字符串中有空格时,它会跳过输入中任何数量的空格字符。那就是说你 必须输入非空白字符,以便继续读取字符串
s

在C/POSIX语言环境中,空白字符可以是:

空格、换行符('\f')、换行符('\n')、回车符('\r'), 水平选项卡('\t')和垂直选项卡('\v')


“%s”中不应有空格 这个句子出现两次的原因是你写了两次

main()
{
    int i;
    char s[100];
    printf("Enter the string \n");
    scanf("%c", &s);
    fgets(s, 100, stdin);
    printf("Enter the string\n");
    scanf("%d",&i);
    printf("%s\n%d\n",s,i);
}

fgets
会使
c
获得许多字符。

它会询问两次,因为有两个
printf
“输入字符串”
,当然。有两个
printf()
在询问,这就是为什么它会询问两次?(除非我有误解)。格式说明符中的前导空格指示
scanf()
跳过前导空格。可能与
%c
重复的字符用于读取单个字符。
fgets
将使其成为多个字符。在
scanf(“%c”,…)之后使用fgets实际上不是一个好做法