0

単語とその他のいくつかの情報を含む構造体を保持する LinkedList 実装があります。LinkedList には、単語がリスト内の構造体の 1 つに既に含まれているかどうかを確認する関数があります。問題は、これが毎回 0 を返すことです。これはなぜですか?

if(strcmp(ll->value->word, word))これは完全に正常にコンパイルされ、この関数のすべての側面がステートメント以外にも機能します。

編集: 申し訳ありませんが、! を追加するのを忘れていました。

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;
    }
}
4

2 に答える 2

0

内のが実行されないreturn場合、明示的な :を持たない関数を通るパスがあるため、コードには未定義の動作があります。returnfor

文字列が等しい場合にstrcmp()返すことに注意してください。文字列が一致しない場合、内は「true」になります。これは、リストの最初のエントリが等しくない場合に返されることを意味します。0iffor0

への変更:

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;
}
于 2013-05-09T07:37:02.013 に答える
0

「return i」の前にデバッグ情報を追加します

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;
}

}

これを試して、あなたが持っているものを見てみましょう

于 2013-05-09T07:37:47.050 に答える