我一直在篡改存储字符数组类型值的链表。我遇到的问题是检索要存储在另一个将用于显示的字符中的值。
我尝试使用(示例(:
char display*;
node * data = <method to retrieve data as node *>
strcpy(display, data->value);
这给了我警告:"传递'strcpy'的参数 2 使指针从整数中没有强制转换"指向数据。
sprintf(display, "%s", data->value);
这给了我警告:
"格式 '%s' 需要类型为 'char *' 的参数,但参数 3 的类型为 'int'">
指向数据>值并建议我改用 %d。
目前,如果我编译第一个字母,则显示,但其余的都是小方块/字符。
我做错了什么?
谢谢
[编辑]
这是结构的初始化:
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 值[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
您需要记住在稍后销毁列表时free
该额外内存。
这仍然不能完全修复您最初发布的代码display
因为它是一个未初始化的指针,因此您不能只是strcpy
或sprintf
它。您要么需要为它分配足够的内存,就像我在上面push
所做的那样,要么您可以将值分配给display
因为从名称来看,您只会显示它。
或者甚至可能根本不在乎display
,只是按原样使用节点中的value
。以下内容就可以了...
node * data = <method to retrieve data as node *>
printf("Node value is %sn",data->value);
发生这种情况是因为结构"节点"的成员"值"可能是 int(整数(类型。
发布所有代码以获取更多详细信息。
转换字符"%s"需要一个字符指针(*char(,并且结构的成员"值"是字符类型(所有字符类型都可以转换为整数类型,因为所有字符都由整数值表示,这正是我之前说过的(。
此外,strcpy 函数不适用于字符类型。strcpy 函数的原型是: char * strcpy ( char * destination, const char * source (;
在您的成员"值"中,您只需要保存字符或字符数组?
如果您需要 char 数组,并且需要将结构更改为:
typedef struct node node_list;
struct node {
char *value;
node_list *next;
};
在将内存分配给节点指针并使用 strcpy 函数后,您已经为 "value" 成员分配了内存,如下所示:
void push(char **value) {
node_list* n = (node_list*)malloc(sizeof(node_list));
n->value = (char *) malloc(sizeof(char));
strcpy(n->value, *value);
printf("Output: %sn", n->value);
free(n->value);
free(n);
}
主程序示例:
int main(int argc, char **argv)
{
char *palavra = (char *) malloc(sizeof(char));
printf("Input: ");
scanf("%[^n]s", palavra);
push(&palavra);
free(palavra);
return (0);
}