0

我有这段代码假设根据分隔符拆分字符串。当分隔符为 '\0' (空字符)时,它似乎有效,但是当我尝试使其与 '\n' (换行符)一起工作时,我最终得到了一个我无法解释的奇怪结果。这是代码:

  char **results = malloc(*nb_delimiter * sizeof(char *));

  // Separate result with delimiter
  char *next;
  char *pointer = "1\n2\n3\n4";
  for (int i = 0; i < *nb_delimiter; ++i)
  {
    next = strchr(pointer, delimiter);
    results[i] = pointer;
    pointer = next + 1;
  }
  printf("%s\n", results[0]);

例如:当我运行它时,它给了我:

  • 结果[0]:1\n2\n3\n4
  • 结果[1]:2\n3\n4
  • 结果[2]:3\n4
  • 结果[3]:4

代替:

  • 结果[0]:1
  • 结果[1]:2
  • 结果[2]:3
  • 结果[3]:4

我真的不明白,当我在 C 中寻找拆分数组的方法时,大多数人建议使用 strchr()。我不明白为什么我有这个问题。

谢谢

4

1 回答 1

1

对于 char* 字符串,表示非常原始:它只是内存中连续的字符序列,空字符\0(零字节)表示字符串的结束位置。没有其他信息可以说明字符串长度是多少。(参见Wikipedia 上的以null 结尾的字符串。)

您的结果 "1\n2\n3\n4"、"2\n3\n4" 等按预期指向字符串的开头,但它们没有在应有的位置结束。您需要将空字符写入原始字符串,替换分隔符,以便将其拆分为多个部分。

但是,源字符串是文字,因此尝试修改它是 UB。因此,要正确执行此操作,首先制作字符串的副本(例如,通过strcpy 'ing 到足够大小的缓冲区中),然后操作该副本。

于 2020-10-21T05:41:37.290 回答