gpt4 book ai didi

C - 用户输入被跳过?

转载 作者:行者123 更新时间:2023-11-30 16:57:55 24 4
gpt4 key购买 nike

我想要一个菜单​​,您可以从中选择一些操作。

问题是,当我们选择一个并按“返回”键时,本应是下一步的用户输入命令被跳过。这是为什么?

代码是:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
int choice;

do
{
printf("Menu\n\n");
printf("1. Do this\n");
printf("2. Do that\n");
printf("3. Leave\n");
scanf("%d",&choice);

switch (choice)
{
case 1:
do_this();
break;
case 2:
// do_that();
break;
}

} while (choice != 3);

return(0);
}

int do_this()
{
char name[31];

printf("Please enter a name (within 30 char) : \n");
gets(name); // I know using gets is bad but I'm just using it

// fgets(name,31,stdin); // gives the same problem by the way.

// Problem is : user input gets skiped to the next statement :
printf("Something else \n");

return(0);
}

最佳答案

scanf() 留下一个换行符,随后对 gets() 的调用将消耗该换行符。

scanf() 之后使用 getchar(); 或使用循环读取并丢弃字符:

int c;
while((c= getchar()) != '\n' && c != EOF);

我知道您曾评论过 gets() 不好。但即使它是一个玩具程序,您也不应该尝试使用它。它已从最新的 C 标准 (C11) 中完全删除,即使您正在为 C89 编程(由于其缓冲区溢出漏洞),也不应该使用它。使用 fgets() 其作用几乎相同,只是可能会留下尾随换行符。

如果这是您的完整代码,那么您还需要一个原型(prototype)或至少一个 do_this() 声明。隐式 int 规则也已从 C 标准中删除。所以添加,

int do_this();

位于源文件的顶部。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com