请问c语言怎么多次接收带空格的输入

char s1[50], s2[50], s3[50];

scanf("%[^\n]", &s1);
scanf("%[^\n]", &s2);
scanf("%[^\n]", &s3);

在s1输入带空格的字符串后,会直接跳过s2和s3的输入,这是怎么回事啊

读取字符串变量前面不需要加&
scanf("%[^\n]", s1);
scanf("%[^\n]", s2);
scanf("%[^\n]", s3);

因为前面 scanf("%[^\n]", s1);用户输入了数据和换行符‘\n’,在读取了非换行符‘\n’的数据之后,输入缓存里就残留了一个‘\n’。
再次使用scanf("%[^\n]", s2);还会读取到输入缓存里上次残留的‘\n’,也就是读取了一个空字符串,而不是读取新输入的字符。
可以在用下一个scanf("%[^\n]", s2);读取字符串前用 setbuf(stdin, NULL); 清除输入缓存。 或者用getchar() 把缓存里上次残留的‘\n’先读取掉
你题目的解答代码如下:

#include<stdio.h>
int main()
{
    char s1[50], s2[50], s3[50];

    scanf("%[^\n]", s1);
    setbuf(stdin, NULL);
    scanf("%[^\n]", s2);
    setbuf(stdin, NULL);
    scanf("%[^\n]", s3);

    printf("%s\n", s1);
    printf("%s\n", s2);
    printf("%s\n", s3);

    return 0;
}

img

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

有很多方法输入一行包括空格,比如gets(), gets_s(), fgets(),以及getchar()加循环

#include <stdio.h>

#define N 50

int main()
{
    char s1[N], s2[N], s3[N];
    fgets(s1, N, stdin);
    fgets(s2, N, stdin);
    fgets(s3, N, stdin);
    printf("%s", s1);
    printf("%s", s2);
    printf("%s", s3);
    return 0;
}