将char *拆分为char * Array

我正在尝试将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-> gates [0]; 我希望以后能够列出门arrays..

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

谢谢大家。

当我只有指针但是当String(char *)/ Arrays / Pointers混合时,它没关系..我无法管理= 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()); } 

你不喜欢error handling吗?

至于你的另一个问题:

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

calloc首先将结果内存初始化为0,与malloc不同。 如果你在上面看到我将缓冲区的结尾设置为’\ 0’(实际上是0),那是因为malloc返回一个带有潜在随机(非零)数据的缓冲区。 calloc将首先将整个缓冲区设置为全0,这通常更安全。