fgets函数完全被忽略

时间:2016-04-23 17:10:07

标签: c input io newline fgets

这是我面临的问题的一个例子:

void print() {
    printf("Hello");
}

int main() {
    char a[LENGTH]; //LENGTH equals 20
    printf("Please enter something: ");
    fgets(a, LENGTH, stdin);
    print();
    return 0;
}

程序在屏幕上显示“请输入内容:”,并且不允许用户使用fgets()函数输入字符串。它直接移动到print()函数,因此在屏幕上打印“Hello”。

为什么会这样?有没有办法解决它?

修改

此代码也会出现同样的问题:

void prints(){
    printf("Hello world, how are you?");
}

int main() {
    printf("blah\n");
    printf("blah\n");
    printf("blah\n");
    printf("blah\n");
    printf("blah\n");
    printf("blah\n");//all these printfs are necessary.
    printf("Enter a number: ");

    fflush(stdout);
    fflush(stdin);
    int number;
    scanf(" %d", &number);
    printf("Please write something: \n");

    char a[MAXSTRING];
    fgets(a, MAXSTRING, stdin);
    prints();

}

1 个答案:

答案 0 :(得分:1)

回答更新后的问题;改变这个:

scanf(" %d", &number);
printf("Please write something: \n");

到此:

scanf(" %d", &number);
getchar();
printf("Please write something: \n");

这个问题与我们之前谈过的Caution with scanf()例子有关。用户输入一个号码,他做了什么?他点击进入!

scanf()不会消耗它(你告诉它读取一个数字,%d),因此换行符(来自输入笔画)保留在输入缓冲区中。然后调用fgets()并在输入缓冲区中找到一些内容,因此它会对其起作用。

一个简单的解决方案是使用getchar()来使用新行,scanf()没有收集,以便在调用fgets()时输入缓冲区为空。

改变这个:

printf("Please enter something: ");

到此:

printf("Please enter something: \n");

使用换行符!

请阅读ref

  

从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。