C语言IF语句中OR逻辑判断异常,正确输入仍提示无效选项
问题原因
你的代码逻辑错误核心是IF判断中混淆了**逻辑或(||)和逻辑与(&&)**的适用场景:
- 你当前使用的
||(逻辑或)规则:只要任意一个子条件成立,整个表达式结果就为真 - 你写的判断条件:
(opc!='t') || (opc != 'c') || (opc != 'r') || (opc != 's') || (opc !='e')
不管用户输入5个合法字符中的哪一个,都会至少满足4个「不等于其他合法字符」的子条件,因此整个if表达式永远为真,哪怕输入正确也会触发报错提示。比如你输入合法的t,此时opc!='c'这个条件是成立的,整个if判断就会触发。
修复方案
将if判断中的所有||替换为&&即可,你的需求是「当输入的字符不等于所有合法值时才报错」,符合逻辑与的规则:只有所有子条件都成立时,整个表达式才为真。
修正后的完整menu函数代码:
int menu() { char opc; do { printf("Areas\n"); printf("\nTriangle (nr): \t\t\tRectangle (nr): \n"); printf("\nCircle (nr): \t\t\t\tSquare (nr): "); printf("\n\n\t\tOPIONS"); printf("\n\n\t(T)riangle\n\t(R)ectangle\n\t(S)quare\n\t(C)ircle\n\t(E)nd\n\n"); scanf(" %c", &opc); // 把||替换为&& if((opc!='t') && (opc != 'c') && (opc != 'r') && (opc != 's') && (opc !='e')) { printf("\nInvalid option, try again\n"); } } while(opc!='e'); return opc; }
可选优化
如果需要兼容用户输入大写字符的场景(比如用户输入T而不是t),可以在scanf后加一行转小写的逻辑,需要提前引入<ctype.h>头文件:
scanf(" %c", &opc); opc = tolower(opc); // 统一转小写,兼容大写输入
内容的提问来源于stack exchange,提问作者Dan's
相关产品推荐
相关产品推荐

