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

C语言指针数组:自定义大小写不敏感字符串比较函数无法进入while循环

问题根本原因

你实现的str_compare函数存在指针层级理解错误、类型不匹配、逻辑完全错位的问题,直接导致循环判断条件不成立,进入函数后要么直接跳过循环、要么第一次进循环就触发break退出,根本不会执行预期的逐字符比较逻辑。

具体错误拆解
  • 函数入参类型完全错误:are_sorted中传入的strings[i]是char*类型的字符串首地址,但你把str_compare的入参定义成了char**二级指针,类型不匹配属于未定义行为,传入的char*值会被强行解释为二级指针的地址值,后续所有基于这个错误类型的逻辑全错。
  • 循环判断逻辑从根上错误:你写的while (str1 && str2)是在判断两个指针变量本身是否为空,根本不是判断指针指向的字符是否为字符串结束符'\0';循环内部的大小比较全是拿指针的内存地址值和ASCII常量'A'(65)、'Z'(90)做对比,内存地址的数值远大于普通ASCII字符的取值范围,所有判断分支永远不会成立,第一次进入循环就会直接走到break退出。如果传入的字符串指针本身为空,while的判断条件直接为假,连循环体都不会进入,和你描述的现象完全吻合。
  • 指针移动、字符取值逻辑错误:你全程没有对指针做正确解引用获取实际存储的字符值,写的**str1++存在运算符优先级问题——++优先级高于*,这个写法实际是先偏移二级指针本身的地址,再做两次无意义的解引用,根本不会移动字符串的遍历位置,还会触发非法内存访问。
  • 排序校验逻辑有漏洞:就算比较函数正确,你把相邻字符串的比较结果累加判断是否大于0的逻辑也会误判——比如前一对字符串比较返回1(前大后小,顺序错误),后一对比较返回-1(前小后大,顺序正确),累加结果为0,会错误判定整体有序,漏掉已经存在的逆序对。
修正后的实现
#include <ctype.h>
#include <stdbool.h>

// 大小写不敏感字符串比较,返回规则和标准strcmp一致:
// str1 < str2 返回负数,str1 == str2 返回0,str1 > str2 返回正数
int str_compare(const char *str1, const char *str2) {
    while (*str1 != '\0' && *str2 != '\0') {
        // 统一转小写后比较,转unsigned char避免tolower对负值字符的未定义行为
        char c1 = tolower((unsigned char)*str1);
        char c2 = tolower((unsigned char)*str2);
        if (c1 != c2) {
            return c1 - c2;
        }
        // 指针后移,遍历下一个字符
        str1++;
        str2++;
    }
    // 处理其中一个字符串提前遍历结束的场景
    return tolower((unsigned char)*str1) - tolower((unsigned char)*str2);
}

bool are_sorted(char *strings[], int n) {
    // 元素数<=1时天然有序
    if (n <= 1) {
        return true;
    }
    for (int i = 0; i < n - 1; i++) {
        // 只要发现一对相邻字符串逆序,直接返回无序,无需累加结果
        if (str_compare(strings[i], strings[i + 1]) > 0) {
            return false;
        }
    }
    return true;
}

内容的提问来源于stack exchange,提问作者rachel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:33:23