C语言Do...while循环条件异常:特定输入不触发循环的问题求助
C语言输入限制循环的问题排查与修正
问题根源:循环条件逻辑错误
你写的while条件toupper((unsigned char)package_choice) != 'A' && 'B' && 'C'完全不符合预期逻辑。C语言中,非零值会被视为布尔真,'B'和'C'的ASCII值都是非零的,所以这个条件等价于:
toupper(...) != 'A' && 1 && 1
也就是说,只要输入转换后不是'A',条件就为真,循环继续执行——这就是为什么输入B、C会重复循环,输入A会退出的原因。
当你改成||时,条件变成toupper(...) != 'A' || 'B' || 'C',同样因为'B'和'C'恒为真,整个条件永远为真,导致无限循环。
正确的条件写法
我们需要判断:转换后的字符既不是'A',也不是'B',还不是'C',此时才继续循环。有两种常见写法:
写法一:用&&连接多个不等于判断
#include <ctype.h> // 必须包含该头文件才能使用toupper char package_choice; do{ printf("Which package would you like to select? A, B, or C "); scanf(" %c", &package_choice); }while(toupper((unsigned char)package_choice) != 'A' && toupper((unsigned char)package_choice) != 'B' && toupper((unsigned char)package_choice) != 'C');
写法二:用!和||组合判断(更简洁)
先把转换后的字符存起来,避免重复调用toupper,可读性更好:
#include <ctype.h> char package_choice; do{ printf("Which package would you like to select? A, B, or C "); scanf(" %c", &package_choice); char upper_choice = toupper((unsigned char)package_choice); }while(!(upper_choice == 'A' || upper_choice == 'B' || upper_choice == 'C'));
额外提示
scanf(" %c", ...)里的空格是正确写法,它会跳过输入中的空白字符(比如回车、空格),避免读取到上次输入留下的换行符。
内容的提问来源于stack exchange,提问作者jtward17
相关产品推荐
相关产品推荐

