我最近开始学习C语言,我遇到了第一个问题。我目前正在尝试打印位于头文件struct typedef node
中的menu.h
的值,如下所示:
#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和主要方法: menu.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);
}
答案 0 :(得分:0)
不确定您使用memmove
尝试实现的目标,但这可能会导致您的问题。只需使用字符串复制例程strncpy等复制字符串
但原因是你将结构的name
成员分配给局部变量rightPart
。该函数调用完成后,rightPart
不再有效。不要使用char指针,而是将char * name设置为struct中的char name [100]。
一旦工作正常,您可以通过为名称字符串等使用动态内存分配来提升代码级别。