【问题标题】:Split char* to char * Array将 char* 拆分为 char * 数组
【发布时间】:2012-02-25 09:38:34
【问题描述】:

我正在尝试将 char* 拆分为 C 中的 char* 数组。 我习惯用 Java / PHP OO 编程。我知道用这些语言可以做到这一点的几种简单方法,但在 C 中......我完全迷失了。我经常有几个小时的段错误)

我正在使用 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] 中;等等。 我希望能够在之后列出门阵列..

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

谢谢大家。

当我只有指针时没关系,但当 String(char*) / Arrays / Pointers 混合时.. 我无法管理 =P

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

谢谢!

【问题讨论】:

  • “我习惯用 Java / PHP OO 编程”。那你可能会想坚持下去。 ;)
  • 1) 拿起一本关于 C 的书; 2)请不要投malloc()的结果。 (或者根本不施放,句号,除非你真的明白为什么。)

标签: c arrays pointers split


【解决方案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,这通常会更安全。

【讨论】:

  • 人们应该只学习正则表达式而不是所有这些 XML 解析器的废话...... ;-)
  • 哈!或者使用可以安全引用可能不存在的结构的语言,例如 perl 哈希树。
猜你喜欢
  • 2017-10-27
  • 1970-01-01
  • 2023-04-10
  • 2021-12-06
  • 2013-02-23
  • 2011-06-08
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多