C fgets从提示中读取换行符

C fgets从提示中读取换行符,c,shell,fgets,stdio,C,Shell,Fgets,Stdio,我应该提到,这在另一个环境中确实有效:在我们的编程类中,我们通常使用IDE代码块(这很糟糕),所以我只在终端中使用gcc编译器和vim(我在arch上)。直到最近我才遇到问题,当时我不得不读取包含空格的字符串。为此,我认为使用fgets()函数将是一个好主意,但它产生了一些问题。这是代码的样子: void addStudent() { struct Student student; printf("Name of student: "); fgets(student.na

我应该提到,这在另一个环境中确实有效:在我们的编程类中,我们通常使用IDE代码块(这很糟糕),所以我只在终端中使用gcc编译器和vim(我在arch上)。直到最近我才遇到问题,当时我不得不读取包含空格的字符串。为此,我认为使用
fgets()
函数将是一个好主意,但它产生了一些问题。这是代码的样子:

void addStudent() {
    struct Student student;
    printf("Name of student: ");
    fgets(student.name, 25, stdin);
}

但是,这不会提示我在shell中输入,它只是继续并立即读取换行符
\n
。你们知道如何解决这个问题吗?

正如评论所指出的,将
scanf()
这样的函数与
fgets()结合起来是不好的。调用
scanf()
时,它会在输入缓冲区中留下一个换行字符,然后由
fgets()
立即读取,导致它失败,并提示用户。

不要将
scanf()
fgets()
混合使用。最好只使用
fgets()
(后面可能是
sscanf()
)。在此之前您是否使用过任何输入函数?特别是像
scanf
,也许?提供的代码按预期工作-问题可能在其他地方,这就是为什么如果您想要问题的答案/解决方案,则包含a是一个好主意。该问题与调用函数之前读取的任何输入相关。例如,如果使用
scanf()
读取最后一个输入,则可以在输入缓冲区中保留换行符,并立即导致对
fgets()
的调用返回。在这种情况下,解决方案是与读取输入一致-如果使用
fgets()
一次读取
stdin
,则使用
fgets()
到处读取
stdin
。由于您尚未显示前面的代码,因此无法提供更具体的建议-您确实需要提供一个更详细的建议。请使用
fgets
将行读入缓冲区。然后在该缓冲区上使用
sscanf