gpt4 book ai didi

C - 如何在 while 循环中处理用户输入

转载 作者:行者123 更新时间:2023-11-30 17:26:45 27 4
gpt4 key购买 nike

我是 C 新手,我有一个简单的程序,它在 while 循环内接受一些用户输入,并在用户按“q”时退出:

while(1)
{
printf("Please enter a choice: \n1)quit\n2)Something");
*choice = getc(stdin);

// Actions.
if (*choice == 'q') break;
if (*choice == '2') printf("Hi\n");
}

当我运行它并点击“q”时,程序确实正确退出。但是,如果我按“2”,程序首先打印出“Hi”(应该如此),然后继续打印提示“请选择一个选项”两次。如果我输入 N 个字符并按 Enter 键,则会打印 N 次提示。

当我使用限制为 2 的 fgets() 时,也会发生同样的行为。

如何让这个循环正常工作?它应该只获取输入的第一个字符,然后根据输入的内容执行一次操作。

编辑

因此,使用具有较大缓冲区的 fgets() 可以正常工作,并停止重复提示问题:

fgets(choice, 80, stdin);

这种帮助:How to clear input buffer in C?

最佳答案

当您 getc 输入时,请务必注意用户输入了多个字符:至少,stdin 包含 2 个字符:

2\n

getc获取用户输入的“2”时,尾随的\n字符仍在缓冲区中,因此您必须清除它。最简单的方法是添加以下内容:

if (*choice == '2')
puts("Hi");
while (*choice != '\n' && *choice != EOF)//EOF just in case
*choice = getc(stdin);

应该可以解决这个问题

为了完整性:
请注意,getc 返回一个 int,而不是 char。确保使用 -Wall -pedantic 标志进行编译,并始终检查您使用的函数的返回类型。

使用 fflush(stdin); 清除输入缓冲区很诱人,并且在某些系统上,这可以工作。但是:此行为未定义:标准明确规定 fflush 用于更新/输出缓冲区,而不是输入缓冲区:

C11 7.21.5.2 The fflush function, fflush works only with output/update stream, not input stream

但是,某些实现(例如 Microsoft )确实支持 fflush(stdin); 作为扩展。然而,依赖它违背了 C 背后的理念。C 本来就是可移植的,并且通过坚持标准,您可以确保您的代码是可移植的。依赖特定扩展会消除这一优势。

关于C - 如何在 while 循环中处理用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26656691/

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