因此,我试图了解链表如何存储字符串类型的数据。据我所知,链表使用数据结构以一种有点时尚的方式存储数据,这样你就可以很容易地在其中输入新的数据,删除它们,并根据自己的意愿重新排列它们。我的问题是,我需要从用户那里获取一个字符串,在链表中为其分配一个位置,然后转到列表中的下一个节点,然后再次执行相同的操作。然而,在这一点上,我只是试图从用户那里获取一个字符串,将其存储在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 jobsn");
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_listn");
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("%sn",new_node->value);
}
}
使用strcpy
,而不是将char
分配给不编译的数组。数组不是lvalue,在没有下标的情况下无法赋值,因此任何左边有数组名称的赋值都不会编译。更改
new_node->value = *n;
至
#include <string.h>
...
strcpy(new_node->value, n);
-
不能将字符串作为普通整数赋值。
-
无论何时要复制数组,都必须使用库函数,如
memcpy
或strcpy
。在您的情况下,它的字符数组,即字符串,您必须使用strcpy
。 - 使用
char *strcpy(char *dest, const char *src);
所以在你的代码中,它必须像
strcpy(new_node->value,n);
而不是new_node->value=*n;
下面的链接中提到了使用strcpy
的原因
为什么strcpy功能