【发布时间】:2017-02-02 19:38:19
【问题描述】:
所以,我试图用这个来实现,是创建一个包含三个字符串作为数据的链表。输出显示了预期的字符串,但添加了一些垃圾符号,例如:预期的“string pierwszy”,得到:“string pierwszyn~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;
}
【问题讨论】:
-
man strncpy: [...]strncpy()函数类似,只不过最多复制n个字节的src。警告:如果 src 的前 n 个字节中没有空字节,则放在 dest 中的字符串不会以空值结尾。[...] -
以下代码
tmp->word[strlen(new_word)] = "\0";无法编译。将"\0";(字符串)替换为'\0'(空终止符)。
标签: c string linked-list insert character