所以基本上我试图创建输入简单的缓冲。
如果用户输入的东西比字母“R”或“S”等,那么做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”,则还按了回车!
那么,有多少个字符做你输入?二!
然后getchar()
消耗从标准输入缓冲区“Z”,可以追溯到从用户再次读取,但换行符(回车)在标准输入缓冲区等待。
其结果是,现在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');