在C中的节点之间交换字符串

时间:2014-09-24 01:41:14

标签: c string linked-list nodes swap

我正在尝试交换链接列表中节点之间的数据字段,无法交换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。写作时非常新。

4 个答案:

答案 0 :(得分:3)

为指针指定一个字符数组时,不要复制该数组:

char *temp_word;
temp_word = first->word;

temp_word指向数组的初始元素,因此分配给数组也会改变指针指向的数据。

您可以通过声明包含50个字符的数组并使用strcpymemcpy进行复制来解决此问题:

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 },然后*secondword[50]的内容不会发生深刻变化。您可以使用memcpy更改内容。

答案 3 :(得分:0)

strncpystrdup的适当实施方式是:

#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);
}