2013-05-09 3 views
0

У меня есть реализация LinkedList, которая содержит структуры, содержащие слова и несколько других частей информации. В LinkedList у меня есть функция, которая проверяет, есть ли слово , уже содержащееся в одной из структур в списке. Проблема в том, что это возвращает 0 каждый раз. Любая идея, почему это так?strcmp всегда производит тот же результат

Это компилируется полностью, и каждый отдельный аспект этой функции работает помимо оператора if(strcmp(ll->value->word, word)).

EDIT: Извините, забыли добавить!

int llContains(LinkedList* ll, char* word){ 

    LinkedList* nn= ll; 
    if(nn != NULL){ 
     for(int i=0; nn != NULL; i++){ 
      if(!strcmp(ll->value->word, word)){ 
       return i; 
      } 
      nn = nn->next; 
     } 
    } else { 
     return -1; 
    } 
} 
+0

Вы понимаете, что 'strcmp' возвращает 0 для соответствия строк? – Nick

+0

Извините, все забыли положить в '!'. Проблема была 'else'. Спасибо за помощь! –

ответ

0

код имеет неопределенное поведение, поскольку есть путь через функцию, которая не имеет явный return: если return в for не выполняются.

Обратите внимание, что strcmp() возвращает 0, когда строки равны, поэтому if в for будет «истина», если строки не совпадают. Это означает, что если первая запись в списке не равна, то возвращается 0.

Изменить на:

int llContains(LinkedList* ll, char* word){ 

    LinkedList* nn= ll; 
    if(nn != NULL){ 
     for(int i=0; nn != NULL; i++){ 
      if(strcmp(ll->value->word, word) == 0){ 
       return i; 
      } 
      nn = nn->next; 
     } 
    } 

    /* ALWAYS return a value. */ 
    return -1; 
} 
+0

Правда ... иначе НЕ должно быть –

+0

Спасибо! Вот и все. В то время «чужое» казалось очень хорошей идеей, но, очевидно, не было. –

0

Добавить некоторую информацию отладки, прежде чем "возвращения я"

int llContains(LinkedList* ll, char* word){ 

LinkedList* nn= ll; 
if(nn != NULL){ 
    for(int i=0; nn != NULL; i++){ 
     if(strcmp(ll->value->word, word)){ 
      printf("Linked->word : %s, word : %s\n",ll->value->word, word); 
      return i; 
     } 
     nn = nn->next; 
    } 
} else { 
    return -1; 
} 

}

Попробуйте это, и давайте посмотрим, что у вас есть

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