得到一个<' :签名/未签名不匹配

时间:2014-12-09 02:05:15

标签: c++ strlen

错误是当我将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}

1 个答案:

答案 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也可以解决问题。