You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:06:03