所以,我试图用这个来实现的是创建一个包含三个字符串作为数据的链表。输出显示了预期的字符串,但添加了一些垃圾符号,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;
}
答案 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';