【问题标题】:C: fgets skips user inputC: fgets 跳过用户输入
【发布时间】:2014-01-29 18:04:55
【问题描述】:

我正在尝试使用 fgets 从命令行获取用户输入。代码 sn-p 是允许用户将新节点添加到单链表的函数的一部分。正如您从我的代码中看到的那样,我使用了一个 while 循环来不断请求用户输入(以便他/她可以添加多个节点)。当我运行程序时,第一次一切都很好。但是,当我尝试添加第二个节点时,程序会跳过第一个名称字段的输入请求。在我的命令行中,我得到 First name: Last name:

while (go)
{
    char first_name[256];
    char last_name[256];
    char telephone[256];
    char address[256];

    printf("First name: ");
    fflush(stdout);
    fgets(first_name, sizeof(first_name), stdin);
    //scanf("%s", &first_name);
    fflush(stdin);

    printf("Last name: ");
    fflush(stdout);
    fgets(last_name, sizeof(last_name), stdin);
    fflush(stdin);
    //scanf("%s", &last_name);

    printf("Address: ");
    fflush(stdout);
    fgets(address, sizeof(address), stdin);
    fflush(stdin);
    //scanf("%s", &address);

    printf("Telephone: ");
    fflush(stdout);
    fgets(telephone, sizeof(telephone), stdin);
    fflush(stdin);
    //scanf("%s", &telephone);

    if (!search_by_all(first_name, last_name, address, telephone))
    {
        add_entry(first_name, last_name, address, telephone);
        printf("Success adding entry! Add another entry? 1 for yes, 0 for no.\n");
        scanf("%d", &go);
        fflush(stdin);
        fflush(stdout);
    }
    else
    {
        printf("Error adding entry. Quitting...\n");
        break;
    }
}

我在 stackoverflow 和其他网站上查看过类似的问题,但刷新 stdin 和 stdout 对我没有用。在我的缓冲区中分配更多空间也没有。有什么建议?谢谢!

【问题讨论】:

  • 为什么是fflush(stdin)?至少在大多数平台上,这不是未定义的行为吗?
  • 如果您不使用 Microsoft 编译器,请不要使用 fflush(stdin);
  • 这可能是今天第三个有同样问题的帖子。你scanf 没有读取你在输入go 时输入的换行符。然后下一个 fget 会将换行符读取为空行,从而混淆您的程序。在%d后面加一个空格,即scanf("%d ", &go);
  • @Marian 建议的scanf("%d ", &go); 不起作用,因为scanf()int 之后输入一些非空格之前不会返回,例如"123\nX"scanf() 读取的这个非空白空间终止了您提倡的 ' ' 指令。 scanf() 然后将此非空白空间放回 stdin 以进行下一次 I/O 操作。此外,stdin 通常是缓冲的,因此在'\n' 跟随它要求用户输入"123\nX\n" 之前,不会看到'X'

标签: c input fgets


【解决方案1】:

混合scanf()fgets() 是有问题的。

建议所有fgets() 并检查结果。

// scanf("%d", &go);
char buf[sizeof(go)*3 + 3];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF();
if (sscanf(buf, "%d", &go) != 1) Handle_BadInput;

scanf() 的典型用法将 Enter'\n' 留在 stdin 中。随后对fgets() 的调用将返回 "\n"

注意:确信所有出现的fflush(stdin); 都可能被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2021-11-29
    • 2016-04-26
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多