使用二分查找实现有序字符串首个大写字母查找的代码运行异常求助
代码问题排查
核心故障点
- 返回值逻辑与需求不匹配:你预期函数返回首个大写字符(如示例要求的
'B'),但当前代码两处命中分支返回的都是mid(int类型的索引值),强转为char后是ASCII控制字符,完全不符合预期。需将两处return mid;修改为return str[mid];,才能返回对应位置的字符。 - 缺少必要头文件:使用
isupper、islower必须引入<ctype.h>,否则部分编译器会触发隐式声明错误,导致大小写判断逻辑完全失效,这也是运行异常的常见诱因。
潜在优化点
- mid计算存在溢出风险:当前
mid = (begin + end) / 2的写法,若输入字符串长度极大,begin + end超出int范围会出现溢出。规范写法改为mid = begin + (end - begin) / 2;即可避免。 - 字符判断存在未定义行为风险:
isupper/islower要求入参必须可表示为unsigned char或等于EOF,若平台默认char为有符号类型,传入非ASCII字符(本次题目输入为大小写字母,概率极低)会触发未定义行为。可强制转类型后再传入,例如isupper((unsigned char)str[mid])。
修复后可正常运行的代码
#include <ctype.h> char first_capital(const char str[], int n) { int begin = 0; int end = n - 1; int mid; while (begin <= end) { mid = begin + (end - begin) / 2; if (mid == 0 && isupper((unsigned char)str[mid])) { return str[mid]; } else if (mid > 0 && isupper((unsigned char)str[mid]) && islower((unsigned char)str[mid - 1])) { return str[mid]; } if (islower((unsigned char)str[mid])) { begin = mid + 1; } else { end = mid - 1; } } // 无大写字母时返回空字符作为标识,可按需调整 return '\0'; }
测试验证
以示例first_capital("abcBC", 5)调用为例,修复后流程:
- 初始
begin=0,end=4,计算mid=2,对应字符'c'为小写,设置begin=3 - 下次循环
begin=3,end=4,计算mid=3,对应字符'B'为大写,且前一位'c'为小写,直接返回str[3]即预期的'B'
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

