【问题标题】:C - Problems copying string from one struct to a nodeC - 将字符串从一个结构复制到节点的问题
【发布时间】:2017-02-12 01:24:07
【问题描述】:

我正在尝试将字符串从一个结构中的字段复制到另一个结构(节点),以便最终创建一个哈希表。但是,我在实际的字符串复制中似乎遇到了一些问题。我创建了一个 for 循环来迭代源结构中的字符串,并且我知道迭代工作正常,因为如果我 printf 源字符串 (data[i].c_name),它们打印出来的效果很好。不幸的是,当我尝试打印目的地(class_id)时,它似乎是空的(因此我的哈希函数当然没有做太多)。对这里潜在问题的任何见解将不胜感激。如果我没有提供足够的上下文,请告诉我。

#define LENGTH 30
#define MAX_OBS 80000

typedef struct
{
    char c_name[LENGTH];
    char s_name[LENGTH];
    double value[MAX_OBS];
}
sample;

typedef struct node
{
    char class_id[LENGTH];
    struct node *next;
}
node;

{
    char class_id[LENGTH];

    for (int i = 0; i < total_columns; i++)
    {
        // malloc a new node pointer for each new class label
        node *new_node = malloc(sizeof(node));

        // check that there was sufficient memory
        if (new_node == NULL)
        {
            return 6;
        }

        // copy c_name into node -- failing - class_id is empty
        strcpy(new_node->class_id, data[i].c_name);
        printf("%s\n", class_id);
    }
}

【问题讨论】:

    标签: c struct strcpy


    【解决方案1】:

    删除您打印的最后一个char class_id[LENGTH];,因为它从未初始化。然后切换您的 printf() 以使用 strcpy 的实际目标。

     strncpy(new_node->class_id, data[i].c_name, LENGTH);
     printf("%.*s\n", LENGTH, new_node->class_id);

    我还在我的代码中设置了一些长度限制,以确保您不会在没有终端 \0 的情况下对错误输入做坏事。除非您以故障安全的方式生成它,否则切勿盲目相信您的 C 输入。

    免责声明:桌面检查更改。实际调试留给学生作为练习。

    【讨论】:

    • 啊太棒了!谢谢吉尔伯特!我在概念上有点困惑 - new_node 只是指向 class_id,那么为什么不打印 class_id 呢?另外 - 我绝对可以理解确保只复制允许的 LENGTH 的重要性,但是由于这两个字段都是由相同的 LENGTH 定义的,为什么不把它关掉就不安全了?再次感谢您的帮助!
    • @AllieH 名为 new_node 的局部变量未指向名为 class_id 的局部变量。名为 new_node 的局部变量指向一个节点,该节点有一个名为 class_id 的成员,与名为 class_id 的局部变量无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2012-05-09
    • 1970-01-01
    • 2021-06-19
    • 2022-01-12
    相关资源
    最近更新 更多