【问题标题】:fgets function is completely ignoredfgets 函数被完全忽略
【发布时间】:2016-04-23 17:10:07
【问题描述】:

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

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();

}

【问题讨论】:

  • 你是如何运行你的程序的?
  • scanf() 是你的问题,在这里,在输入流中留下一个换行符,fgets() 然后消耗并立即返回。与printf() 无关。不要将scanf() 与fgets() 混用。这个问题大约有一百万个重复。而fflush(stdin) 是未定义的行为。
  • @PaulGriffiths 我完全同意,但这并不能解释第一个程序的问题。
  • @jdarthenay:第一个程序是假代码,不是他的真实代码。参见他对当前唯一答案的第一条评论:“我认为如果我只写一个像上面这样非常简单的程序,它就等于我遇到问题的那段代码。”
  • 是的,第二个更接近我的真实代码。 gsamara 的答案对于第一个程序是 100% 正确的。

标签: c input io newline fgets


【解决方案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) 个字符或到达换行符或文件结尾,以先发生者为准。

【讨论】:

  • 不幸的是,这个解决方案不适用于我自己的程序。我想如果我只是像上面那样写一个非常简单的程序,那将等于我遇到问题的那段代码。之前有很多 printf() 函数有关系吗?不管怎么说,还是要谢谢你。 (Ευχαριστώ,πάντως:))
  • @George,μπράβο 尝试创建一个最小的示例。你有整个(最小的)代码的链接吗?
  • @George 如果没有看到实际代码,我无法判断。这些问题通常出现在输入缓冲区中留下一些东西并且fgets() 立即使用它时。例如这样的东西:gsamaras.wordpress.com/code/…。你也试过fflush(stdin)吗?
  • @George,我找到了解决方案!正如我所说,输入缓冲区有一些剩菜。 ;)
  • 当前答案中的解决方案也有问题。用户可以点击“42”,您的单个 getchar() 将只消耗 。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 2022-06-15
  • 2011-10-19
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多