2017-01-20 3 views
-2

何かの理由でStrcatが私の構造内のvalueプロパティを好きではありません。なぜ私は分からない。ここに私の構造コードである:ここ連結時のStrcatの問題

typedef struct TrieSearchTree{ 
char value; 
struct DynamicList* children; 
}; 

とすることは、私の方法である:私は時間のために働いてstrcatを取得しようとしてきた

void PrintDynamicListContents(struct DynamicList* dynamicList, char* word) 
{ 
    struct dynamicListNode* currentRecord; 
    struct TrieSearchTree* trieSearchTree; 
    struct dynamicListNode* nextRecord = dynamicList->head; 

    while(nextRecord != NULL) 
    { 
     currentRecord = nextRecord; 
     nextRecord = currentRecord->next; 
     trieSearchTree = currentRecord->entity; 

     if (trieSearchTree != NULL) 
     { 
      if (trieSearchTree->value != WORD_END_CHAR) 
      { 
       char c[CHAR_LENGTH] = ""; 
       strcat_s(c, CHAR_LENGTH, word); 
       strcat_s(c, CHAR_LENGTH, trieSearchTree->value); 
       PrintDynamicListContents(currentRecord, c); 
      } 
      else 
      { 
       printf("%s", word); 
      } 
     } 
    } 
} 

Here is the error message:

Proof that the value from the structure returns something (the 'l' character)

と私がすることができますそれはオンラインチュートリアルを読んでもうまくいきません。すべての助けに感謝します。

+3

'strcat_s()の最後の引数は' 'のchar *'( "文字列")ではなく、 'char'です。コンパイラの警告がないことは確かですか? –

+0

デバッガを使用しようとしましたか? Visual Studioを使用するのはとても簡単です。コンパイラの警告を無視しないでください。 –

答えて

5

strcat_s関数は、第3引数として、NULL終了文字列へのポインタ、具体的にはchar *を想定しています。あなたは単一のcharを渡しています。あなたのコンパイラはこれについてあなたに警告していたはずです。

その文字はポインタとして解釈され、逆参照されています。これにより、undefined behaviorが呼び出されます。この場合、クラッシュが発生します。

文字列に1つの文字を追加する場合は、その文字列と新しいNULL終端文字を手動で追加する必要があります。

char c[CHAR_LENGTH] = ""; 
strcat_s(c, CHAR_LENGTH, word); 
c[strlen(c) + 1] = '\0'; 
c[strlen(c)] = trieSearchTree->value;