While循环在C中有多个条件

While loop with multiple conditions in C

我正在尝试读取必须为 'C' 或 'n' 的字符。
如果不是,打印错误并请求另一个字符。

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int c;
    printf("Enter the character: ");

    c = getchar();

    while (!(c=='C' && c=='n')){
            printf("Wrong!.\n");
            printf("Enter the character: ");
            c = getchar();  
    }

    printf("\n");
    return 0;
}

而我得到的是:

Enter the character: s
Wrong!
Enter the character: Wrong!
Enter the character:

好像在 while 循环中检查了两次。

两件事:

1) 您正在按一个字符,然后按回车键。那是两个字符。如果要阅读整行,请不要使用 getchar.

2) 你的条件没有意义。永远不会出现 c 既等同于 'C' 又等同于 'n' 的情况,因此您正在测试不可能的情况。你的循环永远不会结束。

getchar()用于逐字符输入控制。您仍然可以使用 getchar(),但您必须处理键盘上的所有字符。您可以通过忽略您不关心的字符来做到这一点。

我也会重组你的循环做一个 do-while 循环而不是 while 循环

要修改您的代码以捕获大小写 A-Z,您可以执行以下操作:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int c;
    printf("Enter the character: ");

    do {
        c = getchar(); 

        // ignore non a-z or non A-Z
        if( c < 'A' || ( c >'Z' && c < 'a' ) || c > 'z' ) {
            continue;
        }

        // look for the characters you care about
        if( c=='C' || c=='n') {
             break;
        }

        // now we only have incorrect characters that are 
        // only upper or lower case
            
        printf("%c Wrong!\n", (char)c );
        printf("Enter the character: ");

    } while (1);

    printf("\n");
    return 0;
}

虽然我还没有测试过这个......你应该得到这样的东西:

Enter the character: s Wrong!

Enter the character: t Wrong!

Enter the character: C

当你输入“s-=+t\n01234C”时.

注意: '\n' 我用来表示从键盘输入的回车return