【问题标题】:How to store data from pointer returned by strtok into struct without it being lost?如何将 strtok 返回的指针中的数据存储到结构中而不会丢失?
【发布时间】:2016-01-22 21:18:16
【问题描述】:

我有一个需要解析的 malloced 字符串。我使用strtok() 完成了所有解析。 Strtok 已返回一个指向我的指针,如果我 printf 使用该指针,则已解析字符串的正确部分将被打印。之后,我将释放 strtok 返回的指针也指向的 malloced 字符串。

如何将指针指向的内容存储到结构中,这样即使在主字符串被释放后,值仍保留在结构变量中。

字符串:Tommy-1234567

我的strtok返回指针:

char *studentName= strtok(String1,"-");
char *studentNo= strtok(NULL,"-");

我的结构:

typedef struct Student{
    char *name;  //Want name to be stored here even after string is freed
    int  *studentNumber;  //Want no. to be stored here even after string is freed
}Student;

【问题讨论】:

  • strdup(studentName) 怎么样?
  • 使用strdupfree 不是 strtok 返回的(字符串)指针:它指向 您传递给它的字符串 的碎片部分。您唯一释放的是原始字符串指针(如果是malloced)或片段指针(如果它们是strduped)。
  • @WeatherVane 对不起,如果我解释得不好,但是是的,我指的是释放分配的字符串。
  • 对不起,如果我解释得不好。 strdup 将分配更多内存,并复制解析字符串的片段。然后您可以free 原始字符串。稍后,当您完成 student 结构时,您可以释放存储在 student.name 中的指针。
  • 拥有student.studentNumber 的指针是没有用的。由于数据是int,这比存储数字更复杂。

标签: c pointers struct


【解决方案1】:

在这个关于strdup 的使用示例中,程序会复制从strtok 获得的数据。然后原始字符串可以是freeed

发布的代码尝试将char* 指针分配给int* 时出错。在 C 中,文本数字不会自动转换为 int

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Student{
    char *name;
    int  studentNumber;
} Student;

int main(void)
{
    char *string;
    char *tok;
    Student acolyte;

    // set up the input, like this to show use of `strdup` and `free`
    string = strdup("Tommy-1234567");       // allocate memory for source string
    if (string == NULL)                     // check it worked
        return 1;                           // failure

    // student name
    tok = strtok(string, "-");              // isolate first token
    if (tok == NULL)                        // check it worked
        return 1;                           // failure
    acolyte.name = strdup(tok);             // allocated mem for substring and copy
    if (acolyte.name == NULL)               // check it worked
        return 1;                           // failure

    // student number
    tok = strtok(NULL, "-");                // isolate next token
    if (tok == NULL)                        // check it worked
        return 1;                           // failure
    if (sscanf(tok, "%d", &acolyte.studentNumber) != 1)     // extract int
        return 1;                           // failure

    free(string);                           // can now get rid of source data

    // show result
    printf("Name: %s\n", acolyte.name);
    printf("Number: %d\n", acolyte.studentNumber);
    free(acolyte.name);                     // free the memory in struct
    return 0;
}

程序输出:

Name: Tommy
Number: 1234567

【讨论】:

  • 我是否必须像释放任何其他我 malloc 的指针一样释放所有我 strdup 的指针?
  • 是的,因为strdup 调用malloc
  • 抱歉,我对此还有一个问题。如果我有另一个免费功能,我想释放我所做的所有 strdups。有没有办法释放与该结构相关的所有 strdup。或者我真的必须一个接一个地做 free(tok)...free(acolyte.studentNumber)。
  • 你必须一一释放strdup返回的指针。但是你不能试图释放strtok 返回的指针。它们只是指向原始字符串的一部分(本身已被释放),它们没有被分配内存。这就是你使用strdup 的原因,因为tok 指针(以及原始字符串)将变得无效。事实上,您可以看到 tok 被下次使用 strtok 覆盖。
【解决方案2】:

分配更多内存

由于您要释放已解析的字符串,请参阅man(3) strdup

char *newstring = strdup(oldstring);

【讨论】:

  • 我是否必须像释放任何其他我 malloc 的指针一样释放我 strdup 的所有指针?
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多