谁能解释一下为什么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的一些基本格式。谢谢你的帮助!
3条答案
按热度按时间dw1jzc5e1#
这一行并不是你想象的那样:
......上面实际上做的事情在逻辑上等同于这个:
...并且由于'B'(也称为ASCII值66)和'C'(也称为ASCII值67)总是不等于零,表达式的这些部分将总是平凡地评估为true,因此对测试的行为没有影响。
为了正确地表达您想要的逻辑,表达式应该如下所示:
8nuwlpux2#
C不是这样工作的。
表达式
toupper((unsigned char)package_choice) != 'A' && 'B' && 'C'
对您来说可能看起来像一个接近英语的表达式,但它对C编译器的含义却截然不同。要检查某个值是否是几个不同值中的一个,请首先计算要比较的值:
然后根据每个选项检查该值:
总表达量:
(Also,您应该检查
scanf
的返回值,以确定它是否成功地获得了输入!)brccelvz3#
其他人已经指出了
&&
(和||
)是如何用于连接两个条件的结果的逻辑运算符。不幸的是,您的代码没有正确使用它们。对于一组有限的有效单字符输入,也可以选择使用C的标准“字符串库函数”之一。在本例中为
strchr()
。如果在提供的有效选择的字符串中找不到该字符,则返回空指针,并且not条件计算
true
,因此重复循环。熟悉一下C语言的字符串函数,它们在任何地方都可以使用。
您可以在程序的其他
do/while()
中使用类似的版本。