C语言如何比较字符数组与单个字符?do while死循环问题排查
代码问题排查与修复
你的代码确实存在两处核心问题,直接导致死循环:
1. 逻辑运算符使用错误(死循环的根本原因)
你当前的循环判断条件和错误提示判断条件,都错误使用了逻辑或||:
// 错误写法,该表达式永远为真 (answer[i] != 'y') || (answer[i] != 'n')
逻辑解释:无论输入什么字符,都不可能同时等于y和n,所以只要用||连接,就永远满足循环条件,导致死循环:
- 输入
y时:answer[i] != 'n'成立,整体表达式为真 - 输入
n时:answer[i] != 'y'成立,整体表达式为真 - 输入其他字符时:两个条件都成立,整体表达式为真
修复方案:将逻辑或||替换为逻辑与&&,只有当输入既不是y也不是n时,才进入循环重试。
2. 输入读取逻辑存在缺陷
你用%s读取单个用户输入的写法会造成内存越界:%s格式符会在用户输入的末尾自动追加字符串结束符\0,写入answer[i]时会覆盖数组后续的内存空间,引发未定义行为。
如果改为%c读取单个字符,需要注意缓冲区残留的换行符会被%c直接读取,导致判断逻辑失效。
修复方案:使用带前置空格的%c格式符,自动忽略输入前的所有空白字符(包括换行、空格):
scanf(" %c", &answer[i]);
修复后的完整代码片段
char answer[10]; for (i = 0; i < wish; i++) { /* ... */ /* ... */ do { printf(" Does this item have financing options? [y/n]:"); // 加空格忽略前置空白字符 scanf(" %c", &answer[i]); // 逻辑改为&& if ((answer[i] != 'y' ) && (answer[i] != 'n')) { printf("\nERROR: Must be a lowercase 'y' or 'n'"); } // 逻辑改为&& } while ((answer[i] != 'y') && (answer[i] != 'n')); }
内容的提问来源于stack exchange,提问作者user3445515
相关产品推荐
相关产品推荐

