C: fgets 跳过用户输入

标签 c input fgets

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

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 和其他网站上看过类似的问题,但刷新标准输入和标准输出对我来说没有用。在我的缓冲区中分配更多空间也没有。有什么建议么?谢谢!

最佳答案

混合使用 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() 然后返回 only "\n"

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

关于C: fgets 跳过用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21439059/

相关文章:

c - 为什么我得不到 "Segmentation Fault"?

c - 在 C 中访问传递的结构数组的成员

c++ - sscanf 变长字符串解析

c - gethostbyname() 函数返回空缓冲区

ruby-on-rails - 输入上方的 Rails simple_form 标签

javascript - 改变 HTML 输入扰乱了我的 JS setInterval() 计时

c - fgets 不起作用 -

c - 如何使用 fgets 读取包含字符串和整数的文件

excel - 如何选择表格列中最后一个填充的单元格

c - C 中的 Fget 和 EOF