gpt4 book ai didi

c - 在c中将字符串插入链表时出现垃圾字符

转载 作者:行者123 更新时间:2023-11-30 21:07:49 25 4
gpt4 key购买 nike

所以,我想要实现的目标是创建一个包含三个字符串作为数据的链表。输出显示了预期的字符串,但添加了一些垃圾符号,例如:预期的“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;
}

最佳答案

问题在于以下行:

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]);

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

所以你所说的第一个“垃圾”字符是某个字符串地址的 ASCII 等价物,其他字符就是当时内存中的字符。

正确的代码当然是以下内容:

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

关于c - 在c中将字符串插入链表时出现垃圾字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42010899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com