繁体   English   中英

将char *拆分为char *数组

[英]Split char* to char * Array

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

我正在使用TinyXML,并从XML File获取信息。

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

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-> gates [0]中; 等。我希望以后能够列出盖茨阵列。

尝试时总是出现段错误。 顺便说一句,我现在真的不怎么初始化这个指针数组。 我总是将所有gates [i]初始化为NULL,但是当我进行for(int i = 0; i

谢谢大家

当我只有指针但混合使用String(char *)/数组/指针时,这没关系。我无法管理= P

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

谢谢!

人们使用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());
}

您不只是喜欢错误处理吗?

至于您的其他问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM