首页 > 解决方案 > do...while 循环有问题

问题描述

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

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

标签: c

解决方案


发生这种情况是因为您输入了例如“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');

推荐阅读