错误是当我将int的值与设置字符串长度的char的strnlen进行比较时。我正在做的是搜索字符串以查找某个#并跟踪是否找到它。
for (value = 0; value < strlen(stringValue) && !searchFound; value++)
{
if (stringValue[value] == searchDigit)
{
numberTimesSearchFound = numberTimesSearchFound + 1;
//ends loops once it is found
searchFound = true;
} //end of string value if else loop}
答案 0 :(得分:1)
strlen
返回size_t
这是一种无符号类型。您将其与value
进行比较,后者是签名类型。在C中,值必须与要比较的类型相同,此处的规则是value
在比较之前将转换为size_t
。
在你的代码中这没有问题(除了我后面提到的关于INT_MAX的情况),还有其他情况,签名无符号比较确实包含错误。 See here for example。
由于这种可能性,一些编译器会警告所有已签名的未签名比较,以便您可以手动检查代码是否存在错误。
要摆脱此警告,我建议您将value
更改为size_t
类型。如果您在此代码段结束后继续使用value
,那么请确保您之后不再依赖签名无符号比较!
理想情况下,将其范围扩展到循环:
for ( size_t value = 0; ......
NB。如果字符串长于INT_MAX
,则当value
递增超过该值时,原始代码会导致未定义的行为;让value
成为size_t
也可以解决问题。