我尝试用C语言编写一个程序,使用循环,直到从键盘输入特定字符。下面是我的代码:
#include <stdio.h>
main ()
{
char option;
do
{
printf("Enter q to quit: ");
option = getchar ();
}
while (option != 'q');
}
我也尝试过scanf(),但结果总是一样的。下面是我尝试测试程序后的输出:
Enter q to quit: 3
Enter q to quit: Enter q to quit: 2
Enter q to quit: Enter q to quit: 1
Enter q to quit: Enter q to quit: q
有谁能告诉我为什么"Enter q to quit: "总是出现两次,我该怎么解决它?
"Enter q to quit: "出现了两次,因为你的输入缓冲区在第二次运行时仍然有新的行字符在里面。
修复:
#include <stdio.h>
int main ()
{
char option;
do
{
printf("Enter q to quit: ");
option = getchar ();
while(getchar() != 'n'); //Enter this line here.
}
while (option != 'q');
}
当您输入q时,您按q后跟enter(对于C而言,这是一个新的行字符,即n)。
所以当你的循环返回到开始时,'n'仍然在你的输入缓冲区中,getch()会自动读取它,并在再次返回到循环开始之前检查它是否等于q(因此你的文本看起来像打印了两次)。
试试这样使用fgets:fgets (option , 4 , stdin)
你必须确保你有一个足够大的字符数组来容纳这个,所以你应该定义char option [3];
保存'q'、'n'和' ';
fgets是一个很好的解决方案,因为它只存储第二个参数值的字符,而丢弃其余的字符。这意味着1)您不会溢出变量/数组,2)您不会在输入缓冲区中留下垃圾:)
它会被打印两次,因为当你按回车键时,一个换行字符n
被附加到stdin中。
可以通过添加一个额外的getchar来丢弃换行字符:
do
{
printf("Enter q to quit: ");
option = getchar();
getchar(); // discard line feed
}while (option != 'q');
如果您按两个键,您将读取两个字符。如果要读取字符,请调用getchar
。如果你想读取行,调用一些读取行
getchar()函数首先从缓冲区中读取。如果缓冲区是空的,那么它将从标准输入(即屏幕)读取。