Do...while循环只对C中的一个条件起作用

cedebl8k  于 2023-04-05  发布在  其他
关注(0)|答案(3)|浏览(145)

谁能解释一下为什么do... while循环在for b,B,c,or C中会重复自己,而在输入a或A时却不会?这是我正在写的代码的一个子部分。我想把输入的数量限制在a,b,or c中,这样任何其他的输入都只会重复自己,直到它得到一个正确的字母。

do{
        printf("Which package would you like to select? A, B, or C ");
        scanf(" %c", &package_choice);
}while(toupper((unsigned char)package_choice) != 'A' && 'B' && 'C');

我已将&&更改为||但是不管输入什么,它都会一遍又一遍地重复自己。我仔细检查了一遍,对每个字母都做了(unsigned char)package_choice)!=,看看是否有什么改变,但我得到了同样的结果。我还在学校学习C,很难理解C的一些基本格式。谢谢你的帮助!

dw1jzc5e

dw1jzc5e1#

这一行并不是你想象的那样:

while(toupper((unsigned char)package_choice) != 'A' && 'B' && 'C');

......上面实际上做的事情在逻辑上等同于这个:

while(toupper((unsigned char)package_choice) != 'A' && ('B' != 0) && ('C' != 0));

...并且由于'B'(也称为ASCII值66)和'C'(也称为ASCII值67)总是不等于零,表达式的这些部分将总是平凡地评估为true,因此对测试的行为没有影响。
为了正确地表达您想要的逻辑,表达式应该如下所示:

while(toupper((unsigned char)package_choice) != 'A' 
   && toupper((unsigned char)package_choice) != 'B' 
   && toupper((unsigned char)package_choice) != 'C');
8nuwlpux

8nuwlpux2#

C不是这样工作的。
表达式toupper((unsigned char)package_choice) != 'A' && 'B' && 'C'对您来说可能看起来像一个接近英语的表达式,但它对C编译器的含义却截然不同。
要检查某个值是否是几个不同值中的一个,请首先计算要比较的值:

char t = toupper((unsigned char)package_choice);

然后根据每个选项检查该值:

while( (t != 'A') && (t != 'B') && (t != 'C') );

总表达量:

char t;
do{
        printf("Which package would you like to select? A, B, or C ");
        scanf(" %c", &package_choice);
        t = toupper((unsigned char)package_choice);
} while( (t != 'A') && (t != 'B') && (t != 'C') );

(Also,您应该检查scanf的返回值,以确定它是否成功地获得了输入!)

brccelvz

brccelvz3#

其他人已经指出了&&(和||)是如何用于连接两个条件的结果的逻辑运算符。不幸的是,您的代码没有正确使用它们。
对于一组有限的有效单字符输入,也可以选择使用C的标准“字符串库函数”之一。在本例中为strchr()

#include <string.h>
//...
do {
    // stuff
} while( !strchr( "ABCabc", package_choice ) );

如果在提供的有效选择的字符串中找不到该字符,则返回空指针,并且not条件计算true,因此重复循环。
熟悉一下C语言的字符串函数,它们在任何地方都可以使用。
您可以在程序的其他do/while()中使用类似的版本。

do {
    // stuff
} while( !strchr( "Yy", package_verify ) );

相关问题