[英]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 *时,程序段错误。
遇到上述情况的原因是您没有在main
为char *
分配内存,或者您正在传递字符串文字。
这两行给您两个不同的问题:
*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
修改字符串。 未定义的行为可以说是最常见的崩溃原因。
如果在构建时启用更多警告,则可能会收到有关此警告,或者您确实得到了警告但忽略了它,或者使用了强制转换来消除它。 来自编译器的警告通常可以很好地指示您执行了不应执行的操作,例如通过强制转换将其隐藏起来只会使警告静音,而不能解决问题。
您的代码还存在其他一些问题。 一种是,如果传递给函数的“句子”中只有一个“单词” /“令牌”,则会在该分配中浪费4092
或8184
字节(取决于32位或64位平台)。 您可能想先执行一个单独的标记化循环(在字符串的临时副本上),以找出输入中“标记”或“单词”的确切数目。
这样做计数也会解决另一个问题:如果有超过 1024个代币/词? 在这种情况下,您的循环将很高兴地超出范围。
这两种情况都是极端情况,您的标准用例可能更适合您的当前代码,但这仍然值得考虑。
您可能在声明时为char *赋值
char *str="abcdef";
否则您可能没有为char * str
指向的字符串分配内存。 在这两种情况下, strtok()
都会导致segmentation fault
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.