我正在尝试交换链接列表中节点之间的数据字段,无法交换char数组。这只是该计划的一个样本。
struct node {
int count;
char word[50];
struct node *next;
};
void swap_nodes( struct node *first, struct node *second ) {
int temp_count;
char *temp_word;
temp_count = first->count;
temp_word = first->word;
first->count = second->count;
first->word = second->word;
second->count = temp_count;
second->word = temp_word;
}
让我知道我做错了什么,我在c。写作时非常新。
答案 0 :(得分:3)
为指针指定一个字符数组时,不要复制该数组:
char *temp_word;
temp_word = first->word;
temp_word
指向数组的初始元素,因此分配给数组也会改变指针指向的数据。
您可以通过声明包含50个字符的数组并使用strcpy
或memcpy
进行复制来解决此问题:
char temp_word[50];
memcpy(temp_word, first->word, sizeof(temp_word));
memcpy(first->word, second->word, sizeof(temp_word));
memcpy(second->word, temp_word, sizeof(temp_word));
答案 1 :(得分:1)
嗯,您已经收到了答案,我只想指出您可以在列表中交换节点位置(而不是节点内容)。由于您有一个链表,您需要节点的父节点才能这样做。
或者,您可以使用动态内存而不是静态数组来表示“word”,这样您只需交换指针,避免数组复制。
答案 2 :(得分:0)
word[50]
是struct node
的一部分,它位于struct node
内部,而您所做的只是将指针*temp_word
指向*first
},然后*second
,word[50]
的内容不会发生深刻变化。您可以使用memcpy
更改内容。
答案 3 :(得分:0)
strncpy
和strdup
的适当实施方式是:
#include <string.h>
void swap_nodes( struct node *first, struct node *second ) {
int temp_count;
char *temp_word;
temp_count = first->count;
temp_word = strdup (first->word);
first->count = second->count;
strncpy (first->word, second->word, 50); /* 50 based on struct definition */
second->count = temp_count; /* could be ( strlen (temp_word) + 1 ) */
strncpy (second->word, temp_word, 50);
if (temp_word) /* free memory allocated with strdup */
free (temp_word);
}