c - 如何从头文件中的struct Hold打印char值?

标签 c struct

我最近开始学习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/

相关文章:

c++ - 静态库和共享库的区别?

c - 编写我自己的内存管理器

c - 减少 ATmega8 的 C 代码大小

c - 如何在C中实现单链表

c - memcpy 给了我奇怪的结构结果

Mac 上的 C : trying to use 'open' does not actually open the url

c - 工作负载分配公式中字符 's' 代表什么

c - 高科技 C 编译器位结构

arrays - 在属性内附加一个结构,该结构是 Swift 中其他结构内的数组

C:如何将结构添加到指针数组