c - 将 char* 拆分为 char * 数组

标签 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->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/

相关文章:

c - C 中字符串的声明

c - 嵌入式c编程背景下高效传递变量给模块

c - 如何从 char 数组(名称数组)中读取?

php - 为什么 PHP 会丢失数组的项值?

c++ - 直接用变量设置指针意味着什么?

c - 如何从 Native C (win32) 调用 COM Interop DLL

c - IF 和 ELSE IF 子句有什么区别?

javascript - 将 Promise 函数映射到数组不会保留结果

c++ - 错误 : cannot increment value of type 'char [6]'

C - 我不明白为什么这段代码没有输出我选择的值。 (指针)