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



我试图在链表中的节点之间交换数据字段,但在交换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写东西很陌生。

当您将字符数组分配给指针时,您不会复制数组:

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

好吧,您已经收到了答案,我只想指出,您可以交换列表中的节点位置(而不是节点内容)。由于你有一个单一的链表,你将需要节点的父节点来做这件事

或者,您可以使用动态内存代替静态数组来表示"单词",这样您只需要交换指针,就可以避免数组副本。

word[50]struct node的一部分,它在struct node的内部,而您所做的只是将指针*temp_word移动到*first,然后移动到*secondword[50]的内容不会发生深刻变化。您可以使用memcpy来更改内容。

使用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);
}

相关内容

  • 没有找到相关文章

最新更新