我最近开始学习C语言,并且遇到了我的第一个问题。我目前正在尝试从位于头文件 menu.h
中的 struct typedef node
打印值,如下所示:
#include <stddef.h>
typedef struct node
{
long nodeID;
char *name;
struct node *child;
struct node *next;
} node;
typedef struct menu
{
node **array;
size_t used;
size_t size;
} menu;
void initMenu(menu*,size_t);
void addNode(menu*,node*);
node* searchMenu(menu*,long*);
void freeMenu(menu*);
node* new_node(long,char*);
node* add_child(node*, node*);
node* search_node(node*,long*);
结构菜单只是一个节点数组。 问题是,然后我尝试从菜单结构中保存的节点打印名称,它会返回如下内容:
�b�x��b�x�
这是为什么呢?我尝试过使用指针,因为最初我认为这是与它们相关的问题,但除了编译错误之外,我没有取得任何成果。值 和 被分配在函数 processA 和 processB 的 main.c
中:
void processA(char *str,menu *c)
{
char leftPart[4];
char rightPart[100];
strncpy(leftPart,str,4);
memmove(&rightPart,str+4,strlen(str));
long nodeId = strtol(leftPart,NULL,10);
addNode(c,new_node(nodeId,rightPart));
}
void processB(char *str,menu *c)
{
char leftPart[4];
strncpy(leftPart,str,4);
memmove(str,str+4,strlen(str));
long childNodeId = strtol(leftPart,NULL,10);
long parentNodeId = strtol(str,NULL,10);
if(parentNodeId > 0) {
add_child(searchMenu(c, &parentNodeId), searchMenu(c, &childNodeId));
printf("%s\n %s\n ",searchMenu(c, &parentNodeId)->name, searchMenu(c, &childNodeId)->name); //prints the name of the node
}
}
P.S 如果解决方案很简单,我真的很抱歉,我刚刚开始学习 C :)
编辑:
这是 menu.c 和 main 方法: 菜单.c:
void initMenu(menu *m, size_t init) {
m->array= malloc(sizeof(node)*init);
for(int i= 0;i<init;i++){
m->array[i] = malloc(sizeof(struct node));
}
m->used= 0;
m->size = init;
}
void addNode(menu *m, node *n) {
if (m->used == m->size) {
m->size *= 2;
m->array = (node **) realloc(m->array, m->size * sizeof(node));
}
m->array[m->used++] = n;
}
node *searchMenu(menu *m, long *n) {
for(int i = 0;i < m->used;i++)
{
if(m->array[i]->nodeID == *n)
{
return m->array[i];
}
}
}
void freeMenu(menu *m)
{
for(int i = 0;i<m->used;i++){
m->array[i]->nodeID = NULL;
m->array[i]->child = NULL;
m->array[i]->next = NULL;
}
free(m->array);
m->array = NULL;
m->used = 0;
m->size = 0;
}
node* new_node(long nodeID,char* name)
{
node *new = malloc(sizeof(node));
if (new) {
new->name = name;
new->nodeID = nodeID;
new->child = NULL;
new->next = NULL;
}
return new;
}
node* add_next(node* a,node* b)
{
if (a==NULL)
return NULL;
while (a->next)
a = a->next;
return (a->next = b);
}
node* add_child(node* a,node* b)
{
if (a==NULL)
return NULL;
if (a->child)
return add_next(a->child, b);
else
return (a->child = b);
}
node* search_node(node* root, long *id)
{
if(root == NULL){
fprintf(stderr,"No tree inserted! Please insert the tree");
return NULL;
}
if(root->nodeID == *id){
return root;
}
node *found;
if((found = search_node(root->next,id)) != NULL){
return found;
}
return search_node(root->child,id);
}
最佳答案
不确定您想通过 memmove
实现什么目的,但这可能会导致您的问题。只需使用字符串复制例程 strncpy 等复制字符串即可。
但原因是您将结构的 name
成员分配给局部变量 rightPart
。一旦该函数调用完成,rightPart
就不再有效。不要使用 char 指针,而是将 char *name 转换为结构中的 char name[100]。
一旦工作正常,您可以通过对名称字符串等使用动态内存分配来升级代码。
关于c - 如何从头文件中的struct Hold打印char值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48642756/