如何从头文件中的struct hold打印char值?

时间:2018-02-06 12:08:17

标签: c struct

我最近开始学习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);
}

1 个答案:

答案 0 :(得分:0)

不确定您使用memmove尝试实现的目标,但这可能会导致您的问题。只需使用字符串复制例程strncpy等复制字符串

但原因是你将结构的name成员分配给局部变量rightPart。该函数调用完成后,rightPart不再有效。不要使用char指针,而是将char * name设置为struct中的char name [100]。

一旦工作正常,您可以通过为名称字符串等使用动态内存分配来提升代码级别。