有麻烦do ... while循环

问题描述 投票:2回答:1

所以基本上我试图创建输入简单的缓冲。

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

c
1个回答
1
投票

这是因为比如你输入“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');
© www.soinside.com 2019 - 2024. All rights reserved.