我一直在篡改存储 char 数组类型值的链接列表。我遇到的问题是检索要存储在另一个用于显示的字符中的值。
我尝试过使用(示例):
char display*;
node * data = <method to retrieve data as node *>
strcpy(display, data->value);
这给了我警告:“传递‘strcpy’的参数 2 会使指针从整数而不进行强制转换”指向数据。
sprintf(display, "%s", data->value);
这给了我警告:
"format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’"
指向 data->value 并建议我使用 %d 代替。
目前,如果我编译,则会显示第一个字母,但其余的都是小方 block /字符。
我做错了什么?
谢谢
[编辑]
这是结构体的初始化:
typedef struct node_list {
char value;
struct node_list * next;
} node;
这是推送:
void push(char *value) {
node_list* n = (node*)malloc(sizeof(node));
n->value = *value;
n->next = head;
head = n;
}
[编辑2]
已修复抱歉浪费了时间。我遵循的指南显然有错误,因为它使用 char 值而不是 char value[10] 声明结构(例如。)
最佳答案
您正在向 push
函数传递一个字符串,但仅将其第一个字符存储在列表节点中。如果您想存储整个字符串,则需要进行一些更改。
首先,您需要将结构中的 value
更改为 char *
。
typedef struct node_list {
char *value;
struct node_list * next;
} node;
并且在您的 push
函数中,您需要创建字符串的副本以将其存储在节点中。
n->value=malloc(strlen(value)+1); // allocate memory to store the new string plus 1 extra for the null terminator
strcpy(n->value, value); // copy the string
当您稍后销毁列表时,需要记住释放
额外的内存。
这仍然无法完全修复您最初发布的代码,因为 display
是一个未初始化的指针,因此您不能只是 strcpy
或 sprintf
到它。您要么需要为其分配足够的内存,就像我在 push
中所做的那样,或者您可以将值分配给 display
,因为从名称来看,您'我们只会显示它。
或者可能根本不关心显示
,而只是按原样使用节点中的值
。以下内容将正常工作...
node * data = <method to retrieve data as node *>
printf("Node value is %s\n",data->value);
关于C:从链表中检索 char 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631190/