2017-02-02 10 views
-3

これで達成しようとしているのは、3つの文字列をデータとして持つリンクリストを作成することです。出力には期待される文字列が表示されますが、いくつかのガベージシンボルが追加されます。f.ex:expected "string pierwszy"、 "string pierwszyn〜rŚÝ"。文字列をcのリンクリストに挿入するとき

私もstrlen(tmp-> word)を印刷しようとしましたが、私は3を得ました。私はそれを得ることはできません。私はそれが1となると思いました。

tmp->word[strlen(new_word)] = "\0"; 

"\0"'\0'の違いがあります:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct element element; 

struct element{ 
    char * word; 
    element * next; 
}; 

element * head = NULL; 

void addWord(char * new_word){ 
    printf("new_word: %s\n\n\n", new_word); 

    element *tmp = NULL; 
    tmp = malloc(sizeof(element)); 

    element *current = head; 

    tmp->word = malloc(sizeof(char) * strlen(new_word)+1); 
    strncpy(tmp->word, new_word, strlen(new_word)); 
    tmp->word[strlen(new_word)] = "\0"; 

    tmp->next = current; 
    head = tmp; 

} 
void free_list(element * node){ 
    if(node != NULL){ 
     free_list(node->next); 
     free(node->word); 
     free(node); 
    } 
} 
void print_list(element * node){ 
    element * tmp = node; 
    while(tmp != NULL){ 
     printf("word: %s\n", tmp->word); 
     tmp = tmp->next; 
    } 
} 
int main() 
{ 
    char * name1 = "string pierwszy"; 
    char * name2 = "drugi"; 
    char * name3 = "333trzeci"; 

    addWord(name1); 
    addWord(name2); 
    addWord(name3); 
    print_list(head); 

    free_list(head); 
    return 0; 
} 
+1

'マニュアルstrncpy':* [...]はstrncpy()関数は、それは、SRCの最大nバイトで がコピーされている以外は、同様です。警告:srcの最初のnバイトの間にヌルバイトがない場合、destに置かれた文字列はNULLで終了しません[...] * – EOF

+0

次のコード 'tmp-> word [strlen(new_word)] = "\ 0";はコンパイルされません。 '\ 0";(文字列)を ''\ 0' '(ヌル終端文字)で置き換えてください。 –

答えて

0

問題は次の行です。この状況では、単純にヌル文字であるため、'\0'は正しいです。 "\0"はヌル文字を含む文字列なので、入力した文字はヌル文字と自動的に追加されたヌル文字の1つで、
{'\0', '\0'}とまったく同じものです。

Cの配列はいくつかの目的のためのポインタとして扱われるので、あなたが書いたコードは2つのヌル文字の配列をメモリに作成し、最初の要素のアドレスをとり、ASCII tableを使用してcharに変換し、それは文字列の中にある。だから何あなたがやったことは基本的にこれを行うことに相当します。

char someString[2]; 
someString[0] = '\0'; 
someString[1] = '\0'; 
tmp->word[strlen(new_word)] = (char)&(someString[0]); 

文字列は、このため任意の終了ヌル文字を持っていないので、文字列が終わるところ、それが与える文字のカップルを続けるので、それは知りません。あなたはちょうどメモリ内に起こった文字。

あなたが言う最初の「ガベージ」文字は、ある文字列のアドレスと同等のASCII文字であり、他の文字列はメモリのすぐ右にあったものです。正しいコードは、次のは勿論である

tmp->word[strlen(new_word)] = '\0'; 
関連する問題