我正在尝试将 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]中; ETC。 我希望能够随后列出门数组..
当我尝试时,总是出现段错误。 顺便说一句,我现在不知道如何初始化这个指针数组。我总是将所有的gates[i]初始化为NULL,但是当我这样做时似乎出现了段错误 for(int i=0;i
谢谢大家。
当我只有指针时还可以,但是当字符串(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());
}
您难道不喜欢错误处理吗?
关于你的另一个问题:
我也看到我们可以使用类似 int *myArray = 的东西 calloc(NbOfRows, NbOfRows*sizeof(int));为什么我们要声明一个数组 像那样.. ? x)
calloc
首先将结果内存初始化为 0,这与 malloc 不同。
如果您看到上面我将缓冲区末尾设置为“\0”(即
实际上是 0),那是因为 malloc 返回一个缓冲区,其中可能包含
其中的随机(非零)数据。 calloc 将首先设置整个缓冲区
首先全部为 0,这通常会更安全。
关于c - 将 char* 拆分为 char * 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117315/