所以基本上我是在尝试为输入创建一个简单的缓冲区。
如果用户输入的不是字母“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):
最佳答案
发生这种情况是因为您输入了“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');
关于c - do...while 循环有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54503849/