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
相关产品推荐
相关产品推荐

