【发布时间】:2014-10-01 14:53:11
【问题描述】:
我是 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);
【问题讨论】:
-
if (*choice == '2') printf("Hi\n"); else printf("Oops: %x\n", *choice & 0xff ); -
我可能会使用
fgets和更大的缓冲区,比如 80 个字符左右。或者在其中插入另一个循环,直到下一个换行符。 -
与其说
while(1),不如直接说while(choice != 'q')。然后把第一个 if 语句全部去掉 -
google 清除输入缓冲区(虽然不要使用
fflush),你不能在脏缓冲区上可靠地使用getc -
@Dylan 当您按下
2<enter>时,2 和换行符都将在stdin上排队等待阅读。因此,您的getc循环消耗 2,再次运行以消耗换行符。这会产生额外的提示,但由于您没有\n的开关盒,因此仅此而已。然后它最终再次打印提示并等待下一个输入。要带走的主要思想是getc要求您自己管理输入缓冲区中的换行符,这可能会很痛苦。fgets方法通常更简单。
标签: c