我正在尝试将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)的
谢谢!
答案 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,这通常更安全。