C:从链表中检索字符值



我一直在篡改存储字符数组类型值的链表。我遇到的问题是检索要存储在另一个将用于显示的字符中的值。

我尝试使用(示例(:

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因为它是一个未初始化的指针,因此您不能只是strcpysprintf它。您要么需要为它分配足够的内存,就像我在上面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);
}

最新更新