Arrays Can';我不知道strhr在C中是如何工作的

Arrays Can';我不知道strhr在C中是如何工作的,arrays,c,string,split,strchr,Arrays,C,String,Split,Strchr,我有一段代码,假设它根据分隔符分割字符串。当分隔符为'\0'(空字符)时,它似乎可以工作,但当我尝试使用'\n'(换行符)时,我最终得到了一个无法解释的奇怪结果。代码如下: char **results = malloc(*nb_delimiter * sizeof(char *)); // Separate result with delimiter char *next; char *pointer = "1\n2\n3\n4"; for (int

我有一段代码,假设它根据分隔符分割字符串。当分隔符为'\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]);
char**results=malloc(*nb_分隔符*sizeof(char*);
//用分隔符分隔结果
char*next;
char*pointer=“1\n2\n3\n4”;
for(int i=0;i<*nb_分隔符;++i)
{
next=strhr(指针、分隔符);
结果[i]=指针;
指针=下一个+1;
}
printf(“%s\n”,结果[0]);
例如:当我运行它时,它会给我:

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

  • 结果[0]:1
  • 结果[1]:2
  • 结果[2]:3
  • 结果[3]:4
我真的不明白,当我在C中搜索拆分数组的方法时,大多数人推荐使用strhr()。我不明白我为什么会有这个问题


感谢使用char*字符串,表示法非常原始:它只是内存中连续的一个字符序列,空字符
\0
(零字节)表示字符串的结束位置。没有附加信息来说明字符串的长度。(见维基百科上的。)

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


但是,源字符串是一个文本,因此无法尝试修改它。因此,要正确地执行此操作,请首先复制字符串(例如,将其放入足够大小的缓冲区中),然后操作副本。

“…大多数人建议使用strchr()”-很有趣,因为我不断看到绝大多数人建议使用
strtok\r
。无论如何,代码中没有任何地方可以(a)复制字符串,也没有(b)通过在分隔符上硬写nullchar值来窃取现有的字符串数据(在这种情况下,无论如何都不能这样做,因为您将修改一个文本,所以即使是
strtok\r
也将被禁止)。您不会在找到的换行符上写入空字节,因此字符串会在换行符后继续。使用
strtok()
strtok_r()
strtok_s()
,分隔符会被空字节截断,因此换行符会变短,字符串也会变短。
strtok()
例程的缺点是,如果有多种可能,您不知道哪个字符被截断了-当只有一个字符(例如换行符)时,就没有问题。但是您不能写入空字符,因为它是一个文本…@AnttiHaapala谢谢,我错过了。我更新了我的答案。