微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法弄清楚strchr如何在C中工作

如何解决无法弄清楚strchr如何在C中工作

我有一段代码,假设该代码根据定界符分割字符串。当分隔符为'\ 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()。我不明白为什么会有这个问题。

谢谢

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。