【发布时间】:2021-01-21 18:57:21
【问题描述】:
所以,我正在尝试构建一个 string_split 函数来根据分隔符拆分 c 样式的字符串。
这是函数的代码:
char** string_split(char* input, char delim)
{
char** split_strings = malloc(sizeof(char*));
char* charPtr;
size_t split_idx = 0;
int extend = 0;
for(charPtr = input; *charPtr != '\0'; ++charPtr)
{
if(*charPtr == delim || *(charPtr+1) == '\0')
{
if(*(charPtr+1) == '\0') extend = 1; //extend the range by one for the null byte at the end
char* string_element = calloc(1, sizeof(char));
for(size_t i = 0; input != charPtr+extend; ++input, ++i)
{
if(string_element[i] == '\0')
{
//allocate another char and add a null byte to the end
string_element = realloc(string_element, sizeof(char) * (sizeof(string_element)/sizeof(char) + 1));
string_element[i+1] = '\0';
}
string_element[i] = *input;
}
printf("string elem: %s\n", string_element);
split_strings[split_idx++] = string_element;
//allocate another c-string if we're not at the end of the input
split_strings = realloc(split_strings, sizeof(char*) *(sizeof(split_strings)/sizeof(char*) + 1));
//skip over the delimiter
input++;
extend = 0;
}
}
free(charPtr);
free(input);
return split_strings;
}
本质上,它的工作方式是有两个char*、input 和charPtr。 charPtr 从输入字符串的开头向上计数分隔符的下一个实例,然后input 从分隔符的前一个实例(或输入字符串的开头)开始计数,并将每个 char 复制到一个新的char*。一旦构建了字符串,它就会被添加到 char** 数组中。
还有一些有趣的位用于跳过分隔符并处理输入字符串的端点。该函数是这样使用的:
int main()
{
char* str = "mon,tue,wed,thur,fri";
char delim = ',';
char** split = string_split(str, delim);
return 1;
}
无论如何,它在大多数情况下都有效,除了返回的 char** 数组中的第一个 char* 已损坏,并且只是被随机垃圾占据。
例如从main 打印split 的元素会产生:
split: α↨▓
split: tue
split: wed
split: thur
split: fri
奇怪的是split_strings[0] 的内容,char* 的数组返回所需的标记是mon,对于这个例子应该是这样,直到主 for 循环的最后一个循环在string_split 函数中,特别是它的行:
split_strings[split_idx++] = string_element;
将其内容从mon 变为垃圾。任何帮助表示赞赏,谢谢。
【问题讨论】:
-
sizeof(string_element)只是指针的大小,而不是它指向的内存大小。 -
调用
realloc()时不会增加string_element和split_string数组的大小。 -
@Barmar 所以我想我可以将
strlen用于string_element,但是如何将split_strings的大小扩大一个char*?感谢您到目前为止的说明。 -
@jf192210 不清楚该函数应返回什么:只是子字符串的位置或由分隔符分隔的子字符串的副本。
-
你应该使用一个变量来保存每个指针的当前分配。然后递增该变量并在
realloc()中使用它。
标签: c split c-strings string-literals function-definition