所以基本上我正在尝试创建一个简单的输入缓冲区。
如果用户输入的字符不是字母“ R”或“ S”,则do while循环会将代码返回到用户输入字母的位置。
但是,例如,当我尝试输入“ Z”时,循环会重复两次,在第二个循环中要求输入。
我不明白为什么,请帮助我理解。
我尝试过...使用while循环?那不行我不想使用goto。
<stdio.h>
<stdlib.h>
int main(void)
{
char r_or_s;
printf("Number Reverser/Shuffler v0.1\t");
printf("Written by REN\n");
printf("This program reverses and shuffles the order of numbers.\n\n");
do
{
printf("Would you like to reverse or shuffle numbers? (Press R/S):");
r_or_s = getchar();
printf("\n");
if (r_or_s == 'R')
{
reverseno();
}
else if (r_or_s == 'S')
{
shuffleno();
}
} while (r_or_s != 'R' || r_or_s != 'S');
return 0;
}
的预期输出
您要反转还是随机播放数字? (按R / S键):
拒绝输入后,但实际输出为:
您要反转还是随机播放数字? (按R / S): 您要反转还是随机播放数字? (按R / S键):
答案 0 :(得分:1)
之所以会这样,是因为您输入了“ Z”,然后还按下了Enter!
那么,您输入了多少个字符?两个!
然后getchar()
从标准输入缓冲区中消耗'Z',返回以再次从用户读取,但是换行符(Enter)在标准输入缓冲区中等待。
结果,getchar()
现在消耗了换行符,从而导致“循环重复两次”。
您还必须考虑换行符。例如,您可以这样做:
if(r_or_s == '\n')
r_or_s = getchar(); // we read the trailing newline character before, read again
此外,您想在用户输入“ R”或“ S”时停止循环,因此您需要更改以下内容:
while (r_or_s != 'R' || r_or_s != 'S');
对此:
while (r_or_s != 'R' && r_or_s != 'S');