【问题标题】:Getting a <' : signed/unsigned mismatch获得 <' : 有符号/无符号不匹配
【发布时间】:2023-03-21 14:31:01
【问题描述】:

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

【问题讨论】:

    标签: c++ strlen


    【解决方案1】:

    strlen 返回size_t,这是一个无符号类型。您将其与 value 进行比较,后者是一个有符号类型。在C语言中,比较的值必须是相同的类型,这里的规则是value在比较之前会被转换为size_t

    在您的代码中,这没有问题(除了我稍后提到的关于 INT_MAX 的情况),还有其他情况,有符号-无符号比较确实包含错误。 See here for example.

    由于这种可能性,一些编译器会警告所有有符号-无符号比较,以便您可以手动检查代码是否存在错误。

    为了摆脱这个警告,我建议将value 更改为size_t。如果您在此代码 sn-p 结束后继续使用 value,请确保您不再依赖任何有符号无符号比较!

    理想情况下,将其范围限定为循环:

    for ( size_t value = 0; ......
    

    注意。如果字符串比INT_MAX 长,那么当value 超过此值时,您的原始代码会导致未定义的行为;将value 设为size_t 也可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2014-06-13
      • 1970-01-01
      相关资源
      最近更新 更多