我想在名为struct data_node
的函数中将字符串插入insert
。我的struct data_node
是
struct data_node {
char name [25];
int data;
struct data_node *next;
};
我的插入功能是:
struct data_node * insert (struct data_node **p_first, int elem, char *word ) {
struct data_node *new_node, *prev, *current;
current=*p_first;
while (current != NULL && elem > current->data) {
prev=current;
current=current->next;
} /* end while */
/* current now points to position *before* which we need to insert */
new_node = (struct data_node *) malloc(sizeof(struct data_node));
new_node->data=elem;
new_node->name=*word;
new_node->next=current;
if ( current == *p_first ) /* insert before 1st element */
*p_first=new_node;
else /* now insert before current */
prev->next=new_node;
/* end if current == *p_first */
return new_node;
};
当我编译时,它表示第22行在分配类型' char [25]'时不兼容。从类型' char'这意味着new_node->name=*word;
是错误的。我怎么能解决这个问题?
答案 0 :(得分:1)
链表结构无关紧要。这个问题归结为将一个char[]
复制到另一个strncpy(new_node->name, word, 25);
。这将有效:
word
有一些警告。如果char[]
没有指向有效的new_node->name
,那么这可能会导致未定义的行为。如果它指向包含超过25个 25个或更多(非空)字符的数组,则操作会将前25个字符复制到new_node->name
,这意味着NAMELENGTH
将不是空终止的,如果其他代码假定它是,则可能在以后引起麻烦。 正如WhozCraig指出的那样,使用null终止目标字符串几乎总是一个好主意 - 确保通过复制少于一个字符(即25-1)为其留出空间。您可以考虑定义一个常量{{1}},这样您就不会在代码中出现幻数25。
答案 1 :(得分:0)
data_node.data
应为void *
。这样你可以存储任何类型(虽然你必须知道它在阅读时的类型)。
答案 2 :(得分:0)