【问题标题】:Reusing structs in loop (in C) [duplicate]在循环中重用结构(在C中)[重复]
【发布时间】:2019-03-10 14:39:26
【问题描述】:

我正在尝试先将数据插入Data 结构,然后将其解析为可以将其放入我的链表的insertFirst 函数。这都是在一个while循环中完成的。

while(fgets(line, 8, file) != NULL)
{
    x= (Data*)malloc(sizeof(Data)); 
    sscanf(line, "%s %s", line, val);

    x->c = line; 
    x->v =val; 

    insertFirst(list, x);
}

但是我正在尝试重用 Data 结构。每次都Mallocing它。我遇到的问题是,尽管这些行被正确读取。 例如LOREM 1IPSUM 3,链表将始终包含IPSUM 3。如何在循环中重复使用这样的结构?

【问题讨论】:

  • val 是如何声明的?
  • 您没有重用该结构。您只是在分配指向 same 字符数组的指针。考虑将commandval 作为数组成员Datasscanf 中直接使用。
  • 另外,sscanf 可能会失败
  • 什么是Data

标签: c struct


【解决方案1】:

另一种可能性是这样的:

typedef struct Data
{
    char command[100]; 
    char value[100]; 
} Data; 

while(fgets(line, 15, inputFile) != NULL)
{
    x= (Data*)malloc(sizeof(Data)); 
    sscanf(line, "%s %s", x->command, x->value);  

    insertFirst(list, x);
}

免责声明:为简洁起见,此处不对字符串进行错误检查或边界检查。

【讨论】:

    【解决方案2】:

    这里的问题是您将cmdval 分配为指向x->commandx->value 的指针,因此x->commandx->value 将始终指向cmdval 中的更新值.

    所以你改变代码如下。

    while(fgets(line, 15, inputFile) != NULL)
    {
        x= malloc(sizeof(Data)); 
        sscanf(line, "%s %s", cmd, val);
    
        x->command = strdup(cmd); 
        x->value = strdup(val); 
    
        insertFirst(list, x);
    }
    

    其中strdup 计算所需空间并动态分配内存并复制输入字符串并返回新分配的指针。

    【讨论】:

    • 谢谢!看到我做错了什么,需要为命令和值分配内存。而且你对 strdup 的使用比我额外的 malloc 更好。
    • @KevinLe strdup 在内部做同样的事情。
    • 比我拥有的更整洁。
    • @KevinLe 当然可以。
    • @Kevin 请注意,虽然 strdup 不是标准 C,所以它不可移植。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多