将字符串插入c中的链表时的垃圾字符

时间:2017-02-02 19:38:20

标签: c string linked-list insert character

所以,我试图用这个来实现的是创建一个包含三个字符串作为数据的链表。输出显示了预期的字符串,但添加了一些垃圾符号,f.ex。:预期的“string pierwszy”,得到:“stringpierwszyn~rŚÝ”。

我也尝试打印出strlen(tmp-> word),我得到3.我不明白,我认为它会是1.我不明白,为什么会这样。

#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 个答案:

答案 0 :(得分:0)

问题在于以下几行:

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

"\0"'\0'之间存在差异。 '\0'在这种情况下是正确的,因为它只是一个空字符。 "\0"是一个包含空字符的字符串,因此它与
完全相同 {'\0', '\0'}(您输入的一个空字符和一个自动添加的字符。)

由于C中的数组被视为用于某些目的的指针,因此您编写的代码会在内存中创建一个包含两个空字符的数组,获取第一个元素的地址,并使用以下内容将其转换为char ASCII table并将其存储在字符串中。所以你所做的基本上等同于这样做:

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

由于这个字符串没有任何终止的空字符,因此它不知道字符串的结束位置,因此它会继续显示几个字符,为您提供恰好位于内存中的字符

所以第一个&#34;垃圾&#34;你所说的字符是某个字符串地址的ASCII等价物,而其他字符串正好存在于那里,就在那时。

正确的代码当然如下:

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