【问题标题】:Why is fgets() being skipped in loop?为什么 fgets() 在循环中被跳过?
【发布时间】:2014-10-24 18:57:00
【问题描述】:

我正在遍历一个循环。在第一次迭代中,我可以在标准输入上写入并获取我想要的数据。在第二个操作中:name 被跳过,它要求我输入 name2。为什么跳过名字?

   for (i = 0; TRUE; i++) {
        printf("> nom :");
        fgets(items[i].name, 15, stdin);
        printf("nom: %s\n", items[i].name);
        if (items[i].name[0] == '.') break;

        printf("> prenom : ");
        fgets(items[i].name2, 15, stdin);
        printf("name2: %s\n", items[i].name2);
    }

【问题讨论】:

  • printf("stdin: %s\n", stdin); --> stdinFILE *,而不是 char *
  • 是的,我添加这个只是为了随机测试。没有得到任何解决方案。知道可能是什么问题@AlterMann
  • 你之前有没有碰巧打电话给scanf()?这是混合面向行和面向场的输入时的常见症状,您最终会得到一个额外的\nstdin 上等待您。
  • 不知道,给我们看一个完整可编译的代码
  • @AlterMann 代码是一个大问题的一部分 我有一个结构 ITEM (char[20] name, char[30] lastname) 我正在通过读取标准输入来填充一个 ITEM 数组。可以用scanf,但是老师要我们用fgets

标签: c loops buffer fgets


【解决方案1】:

您提供的代码不会提示输入name,即使在循环的第一次迭代中也是如此。如果你得到任何提示,那么这就是在进入循环之前发生的。相比之下,提供的代码确实提示输入name2

循环的每次迭代都从读取下一个name(没有提示)开始并打印出来。如果您看到不同的行为,那么您正在运行不同的代码。

【讨论】:

  • 是的,这还不是循环中的全部内容。我在 fgets 之后使用了 scanf,所以我清空了缓冲区,它现在可以工作了。谢谢
猜你喜欢
  • 2015-05-28
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2019-05-22
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多