C语言中strlen(s)-strlen(t)>0判断结果为真的原因是什么
问题原因
核心是strlen函数的返回值类型特性导致的:
strlen的返回值类型是size_t,属于无符号整数类型,所有取值都为非负数。- 两个无符号整数做减法运算时,计算结果也会被判定为无符号整数。你代码中
strlen(s)的值为3、strlen(t)的值为5,二者相减的结果在无符号规则下不会得到有符号的-2,而是一个极大的正整数,该数值远大于变量c的取值0,因此条件strlen(s)-strlen(t)>c判定结果为真,和预期不符。
修复方案
有两种常见的修复方式:
- 强制将
strlen的返回值转换为有符号整数后再做运算:
int len = (( (int)strlen(s) - (int)strlen(t) ) > c) ? strlen(s) : strlen(t);
- 如果你的需求只是取两个字符串的长度最大值,可以直接比较两个长度值,避免减法运算带来的类型异常,这种写法更稳妥:
int len = (strlen(s) > strlen(t)) ? strlen(s) : strlen(t);
内容的提问来源于stack exchange,提问作者rakesh patel
相关产品推荐
相关产品推荐

