2014-12-09 4 views
-3

Ошибка, когда я сравниваю значение int с strnlen символа с заданной длиной строки. то, что я делаю, ищет строку для определенного # и отслеживания, если она найдена или нет.Получение несоответствия <:: signed/unsigned

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

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 be size_t тоже исправления эта проблема.

Смежные вопросы