C++字符串数组求最长字符串长度:初始化max为-1为何输出异常?
为什么初始化max为-1时代码输出-1,初始化为0就正常?
这个问题的核心在于C++的隐式类型转换规则和strlen()函数的返回类型,我给你拆解清楚:
1. strlen()的返回类型是无符号整数
strlen()的返回值类型是size_t,这是一个无符号整数类型(通常和unsigned int或unsigned long等价),它的取值范围是从0到该类型能表示的最大值(比如32位系统下是0~4294967295)。
2. 有符号数和无符号数比较时的隐式转换
当你把int类型的max(初始值为-1)和size_t类型的strlen()返回值做比较时,C++会自动把max转换成size_t类型。而有符号整数-1转换成无符号整数时,会变成该类型的最大值(比如32位下是4294967295)。
这时候你的判断条件max < strlen(a[i])就变成了:
4294967295 < 某个字符串长度(比如5、7)
显然这个条件永远是false,所以循环里的max = strlen(a[i])从来不会执行,max一直保持初始值-1,最后输出的就是-1。
3. 初始化为0时为什么正常?
当你把max初始化为0时,0作为int转成size_t还是0,这时候判断条件0 < strlen(a[i])就完全符合预期了——所有字符串的长度都是正整数,条件会成立,max会被不断更新为更大的长度,最终得到正确的最大长度7。
几个可行的修正方案
- 方案1:统一类型:把
max的类型改成size_t,初始化为0,避免类型转换问题:size_t max = 0; for(int i=0;i<5;i++) if(max < strlen(a[i])) max = strlen(a[i]); - 方案2:显式转换:如果坚持用
int,可以把strlen()的结果显式转成int(注意:如果字符串长度超过int的最大值会有溢出风险):int max = -1; for(int i=0;i<5;i++) if(max < (int)strlen(a[i])) max = (int)strlen(a[i]); - 方案3:保持现有逻辑,初始化max为0:这是你已经验证过的有效方式,简单直接。
内容的提问来源于stack exchange,提问作者Muktadir Khan
相关产品推荐
相关产品推荐

