将char *拆分为char * Array

时间:2012-02-02 17:53:01

标签: c arrays pointers split

我正在尝试将char *拆分为C中的char *数组。 我习惯用Java / PHP OO编程。我知道在这些语言中有几种简单的方法,但在C语言中......我完全迷失了。我经常有几个小时的段错误x)

我正在使用TinyXML并从XML文件中获取信息。

这是我们找到数组的结构。

const int MAX_GATES = 64;

typedef struct {
    char *name;
    char *firstname;
    char *date;
    char *id;
    char *gates[MAX_GATES];
} UserInfos;

这就是我填充这个结构的地方:

    UserInfos * infos = (UserInfos*)malloc(1024);

    infos->firstname = (char*)malloc(256);
    infos->name = (char*)malloc(128);
    infos->id = (char*)malloc(128);
    infos->date = (char*)malloc(128);

    sprintf(infos->firstname, "%s", card->FirstChild("firstname")->FirstChild()->Value());
    sprintf(infos->name, "%s", card->FirstChild("name")->FirstChild()->Value());
    sprintf(infos->date, "%s", card->FirstChild("date")->FirstChild()->Value());
    sprintf(infos->id, "%s", card->FirstChild("filename")->FirstChild()->Value());

    ////////////////////////
    // Gates
    char * gates = (char*) card->FirstChild("gates")->FirstChild()->Value();

    //////////////////////////

唯一的问题是'大门'。 输入表单XML看起来像“gate1 / gate2 / gate3”或有时只是空白。

我希望gate1在infos-> gate [0];等等 我想能够在之后列出门阵列..

我尝试时总是遇到段错误。 顺便说一下,我现在还不知道如何初始化这个指针数组。我总是将所有的门[i]初始化为NULL,但是当我这样做时,似乎我有一个段错误     for(int i = 0; i

谢谢大家。

当我只有指针但是当String(char *)/ Arrays / Pointers混合时,没关系..我无法管理= P

我也看到我们可以使用类似的东西     int * myArray = calloc(NbOfRows,NbOfRows * sizeof(int)); 我们为什么要声明这样的数组..? x)的

谢谢!

1 个答案:

答案 0 :(得分:1)

人们经常使用XML的问题是他们假设所有元素都可用。这并不总是安全的。因此这句话:

sprintf(infos->firstname, "%s", card->FirstChild("firstname")->FirstChild()->Value());

不安全,因为你实际上并不知道是否所有这些 函数实际上返回有效对象。你真的需要一些东西 如下所示(优化速度,因为我没有 知道每个点返回的tinyXML结构名称 我没有存储结果一次,而是调用每个函数 多次:

if (card->FirstChild("firstname") &&
   card->FirstChild("firstname")->FirstChild()) {
   sprintf(infos->firstname, "%s", card->FirstChild("firstname")->FirstChild()->Value());
}

然后,为了防止数据缓冲区溢出,你应该 真的在做:

if (card->FirstChild("firstname") &&
   card->FirstChild("firstname")->FirstChild()) {
   infos->firstname[sizeof(infos->firstname)-1] = '\0';
   snprintf(infos->firstname, sizeof(infos->firstname)-1, "%s", card->FirstChild("firstname")->FirstChild()->Value());
}

难道你不喜欢错误处理吗?

关于你的另一个问题:

我也看到我们可以使用像int * myArray =这样的东西 calloc(NbOfRows,NbOfRows * sizeof(int));我们为什么要声明一个数组 像那样.. ? x)的

calloc首先将结果内存初始化为0,与malloc不同。 如果您在上面看到我将缓冲区的末尾设置为'\ 0'(即 实际上是0),这是因为malloc可能会返回一个缓冲区 其中的随机(非零)数据。 calloc将首先设置整个缓冲区 首先是全0,这通常更安全。