麻烦做... while循环

时间:2019-02-03 14:29:40

标签: c

所以基本上我正在尝试创建一个简单的输入缓冲区。

如果用户输入的字符不是字母“ 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键):

1 个答案:

答案 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');