【问题标题】:How do you store string type data in a linked list in C?如何将字符串类型的数据存储在 C 中的链表中?
【发布时间】:2016-03-04 21:08:04
【问题描述】:

所以我试图了解链表如何存储字符串类型的数据。据我所知,链表使用数据结构以一种有点时尚的方式存储数据,因此您可以轻松地在其中输入新数据,删除它们,并根据需要重新排列它们。我的问题是,我需要从用户那里获取一个字符串,在链接列表中为其分配一个位置,然后移动到列表中的下一个节点并再次执行相同的操作。然而,在这一点上,我只是试图从用户那里获取一个字符串,将它存储在 new_node 值中(或者 (*new_node).value 对于那些考虑指针而不是链表的人)并打印它出去。 main 函数只是要求用户输入字符串,add_to_list 函数获取输入并将其添加到链表的开头,而 print 函数只是打印链表中的任何内容。问题在于我的理解(至少我认为是问题)是我为数据结构分配输入值的点, new_node->value=*n 应该只使值包含输入字符串它只会给另一个数组提供指针 *n 包含的任何值,不幸的是情况并非如此,我不确定为什么会这样。为了简单起见,这里是代码。

编辑:感谢大家的回复和解释为什么 strcpy 在处理将字符数组的值分配给另一个数组时是必要的,即:字符串!

#include <stdio.h>
#include <stdlib.h>
#define LARGE 10

struct node *add_to_list(struct node *list, char *n);
struct node{
    char value[LARGE+1];
    struct node *next;
};

struct node *first = NULL;
void print(void);

int main(void) {
    
    char job[LARGE],*p;
    
    printf("Please enter printing jobs\n");
    scanf ("%s", job);
    p=&job[0];
    
    first = add_to_list(first, p);
    print();
    return 0;
}




struct node *add_to_list(struct node *list, char *n)
{
    struct node *new_node;
    new_node = malloc(sizeof(struct node));
    if (new_node == NULL) {
        printf("Error: malloc failed in add_to_list\n");
        exit(EXIT_FAILURE);
    }
    new_node->value = *n;
    new_node->next = list;
    return new_node;
}

void print(void){
    struct node *new_node;
    for(new_node=first;new_node!= NULL; new_node=new_node->next){
        printf("%s\n",new_node->value);
    }
}

【问题讨论】:

  • 问题或故事?
  • 我想我还不够清楚,问题是如何在代码 new_node->value=*n 中为输入字符串赋值。为什么那个代码不正确?
  • @Senglish 您不能分配给这样的数组。使用 strcpystrcpy(new_node-&gt;value,n);
  • 这在大多数情况下都有效。你会@ameyCU 介意解释为什么 strcpy 有效,而不是仅仅做我所拥有的吗?编辑:我收到与 strcpy 的使用有关的警告,其中 (new_node->value,n) 解释它是类型为 'char *(char, *const char *) 的隐式库函数。这是想向我指出什么?我将指针复制到变量而不为下一个节点分配值的事实?
  • @Senglish 只是您将值直接分配给数组。但是你不能这样做。因此,这个函数strcpy存在用于复制字符串。

标签: c pointers linked-list


【解决方案1】:

使用strcpy 而不是将char 分配给无法编译的数组。数组不是左值,并且不能在没有下标的情况下分配,因此左侧带有数组名称的任何赋值都不会编译。改变

new_node->value = *n;

#include <string.h>

...

strcpy(new_node->value, n);

【讨论】:

    【解决方案2】:
    1. 您不能将字符串分配为正常的整数分配。

    2. 无论何时要复制数组,都必须使用库函数,如 memcpystrcpy。在您的情况下,它的字符数组即字符串您必须使用strcpy

    3. 用法char *strcpy(char *dest, const char *src);

    所以在你的代码中它必须像 strcpy(new_node-&gt;value,n); 而不是 new_node-&gt;value=*n;

    使用strcpy的原因在下面的链接中提到

    why strcpy function

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多