c - do...while 循环有问题

标签 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):

最佳答案

发生这种情况是因为您输入了“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/

相关文章:

c++ - 通过 MonoDevelop 4.0 a.k.a. Xamarin Studio 获得 C/C++ 项目支持

c - 用C读取和写入二进制文件

c - MPI_Type_create_subarray 和 MPI_Gather

c - 了解 Contiki 中的 tcpdump.c 文件

c - 将子进程的返回值接收到父进程中?

javascript - 我可以保存一个文件,该文件将仅使用 javascript/C/C++ 在服务器端从 php 代码生成,并且没有打开浏览器吗?

c - 从 C 中的文本文件中读取列

c - 正确括号的最长子串

c - C函数的原型(prototype)和定义中都需要static关键字吗?

c - 如何为我的程序获取 "execution time for each line of code"?