我正在尝试使用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和其他网站上查看了类似的问题,但是刷新stdin和stdout对我来说不起作用。也没有在我的缓冲区中分配更多空间。有什么建议?谢谢!
答案 0 :(得分: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()
的典型用法是在'\n'
中输入 Enter 或stdin
。随后对fgets()
的调用仅返回 "\n"
。
注意:可能会删除所有fflush(stdin);
的确认信息。