繁体   English   中英

C中带有分隔符的字符串拆分功能

[英]String split function with delimiters in C

我在编写带分隔符的字符串拆分函数时遇到麻烦。 我的功能基于此处的主要功能: http : //www.cplusplus.com/reference/cstring/strtok/

通过main测试时,只能传递char [],而不能传递char *。 传递char *时,程序段错误。

即通过str_split传递一些char str [],而不传递一些char * str。 任何帮助将不胜感激。

char** str_split(char* str, const char* delim)
{
  char* tmp;

  char** t = (char**)malloc(sizeof(char*) * 1024);
  char** tokens = t;

  tmp = strtok(str, delim);

  while(tmp != NULL)
  {
    *tokens = (char*)malloc(sizeof(char) * strlen(tmp));
    *tokens = strdup(tmp);
    tokens++;
    tmp = strtok(NULL, delim);
  }

  return t;
}

通过main测试时,只能传递char [],而不能传递char *。 传递char *时,程序段错误。

遇到上述情况的原因是您没有在mainchar *分配内存,或者您正在传递字符串文字。

这两行给您两个不同的问题:

*tokens = (char*)malloc(sizeof(char) * strlen(tmp));
*tokens = strdup(tmp);

第一行将分配strlen(tmp)字节,但是问题是字符串有一个额外的字符来终止字符串,因此您确实需要分配strlen(tmp) + 1个字节。

第二行覆盖malloc的原始指针,从而导致内存泄漏。

同样,在C语言中,您不应该转换malloc的返回值

哦,还有另一个注意事项:无论char类型的实际位大小如何, sizeof(char)被指定为始终返回1


至于您的段错误,我猜您正在用字符串文字调用函数,例如

some_var = str_split("hello world", " ");

或者可能

char *string = "hello world";
some_var = str_split(string, " ");

这将导致不确定的行为 ,因为字符串文字实际上是指向恒定字符数组的指针,并且strtok 修改字符串。 未定义的行为可以说是最常见的崩溃原因。

如果在构建时启用更多警告,则可能会收到有关此警告,或者您确实得到了警告但忽略了它,或者使用了强制转换来消除它。 来自编译器的警告通常可以很好地指示您执行了不应执行的操作,例如通过强制转换将其隐藏起来只会使警告静音,而不能解决问题。


您的代码还存在其他一些问题。 一种是,如果传递给函数的“句子”中只有一个“单词” /“令牌”,则会在该分配中浪费40928184字节(取决于32位或64位平台)。 您可能想先执行一个单独的标记化循环(在字符串的临时副本上),以找出输入中“标记”或“单词”的确切数目。

这样做计数也会解决另一个问题:如果有超过 1024个代币/词? 在这种情况下,您的循环将很高兴地超出范围。

这两种情况都是极端情况,您的标准用例可能更适合您的当前代码,但这仍然值得考虑。

您可能在声明时为char *赋值

char *str="abcdef";

否则您可能没有为char * str指向的字符串分配内存。 在这两种情况下, strtok()都会导致segmentation fault

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM