实现一个 C 函数,该函数在给定字符上拆分字符串,并在拆分后返回字符串数组(以及数组长度)



我正在尝试实现一个 C 函数,该函数接受一个字符串,然后在某个字符上断开该字符串,并在拆分后返回一个字符串数组以及该数组的大小。我为此使用数据结构,因为返回一个 2D 数组(拆分后的字符串数组(并且其长度是不可能的。我的代码如下:

struct charArr {
char *arr[10000];
int size;
};    
struct charArr *stringSplitter(char *str, char c) {
struct charArr *splitString = (struct charArr *)malloc(sizeof(struct charArr));
if (splitString == NULL) {
fprintf(stderr, "malloc failedn");
exit(1);
}
splitString->size = 0;
int i = 0;
int j = 0;
while (str[i] != '') {
if (str[i] == c) {
splitString->arr[splitString->size][j] = '';
(splitString->size)++;
j = 0;
i++;
while (str[i] == c) {    /* this loop is to ignore continuous occurrences of the character c */
i++;
}
} else {
splitString->arr[splitString->size][j] = str[i];
i++;
j++;
}
}
splitString->arr[splitString->size][j] = '';
return splitString;
}
int main(int argc, char *argv[]) {
// take input from command line
if (argc == 1) {
//buffer to store lines
size_t buffer_size = 128;
char *buffer = malloc(buffer_size * sizeof(char));
if (buffer == NULL) {
fprintf(stderr, "malloc failedn");
exit(1);
}
// loop continuously till user exits by ctrl+c
while (1) {
printf("Enter Input> ");
getline(&buffer, &buffer_size, stdin);
char *str = strdup(buffer);
struct charArr *splitString = stringSplitter(str, '&');
for (int i = 0; i<splitString->size; i++) {
printf("%s ", splitString->arr[i]);
}
}
}
return 0;
}

在一个简单的输入上运行代码时,例如(输入不断从命令行获取(:

输入>这个和那个

我希望输出为:

这个

但是,我收到错误:

分段故障(核心转储(

如果输入如下所示(即连续出现拆分字符(:

输入>这个 &&&那个

那么输出也必须是:

这个

编辑:我正在尝试扩展它以在多个分隔符上拆分字符串(一次性(,因此如果传递了char *c 而不是上述函数中的charc,这是一个分隔符字符串(示例c = " \t">从给定字符串中删除所有空格(,那么它也应该按预期工作并在数组的拆分和长度之后返回一个字符串数组。 例如,如果输入是(多个空格、制表符和换行符(:

Enter Input>      this                               that         

然后返回的数组(它是返回结构的一部分(的大小必须为 2,并且只包含 2 个字符串 - "this"和"that"。

下面是对函数的重写,其中包含使用 strdup(( 正确分配每个找到的字符串所需的更正:

您可以在我的修改前面找到以"以前"开头的注释:

struct charArr* stringSplitter(char *str, char c){
struct charArr* splitString = (struct charArr*)malloc(sizeof(struct charArr));
char buffer[ MAX_BUFF ] ;
if(splitString == NULL){
fprintf(stderr, "malloc failedn");
exit(1);
}
splitString->size = 0;
int i=0;
int j=0;
while(str[i] != ''){
if(str[i] == c){
//Previously:  splitString->arr[splitString->size][j] = '';
splitString->arr[splitString->size] = strndup( buffer , j ); 
(splitString->size)++;
j = 0;
i++;
while(str[i] == c){    /* this loop is to ignore continuous occurrences of the character c */
i++;
}
} else {
// Previously:  splitString->arr[splitString->size][j] = str[i];
buffer[j] = str[i];
i++;
j++;
}
}
//Previously:  splitString->arr[splitString->size][j] = '';
splitString->arr[splitString->size++] = strndup( buffer , j ); 
return splitString;
}

我已经很久没有写任何 C 了,所以我认为这将是一个挑战。 下面是 stringSplitter 函数的重写。

struct charArr* stringSplitter(char *str, char c){
struct charArr* splitString = (struct charArr*)malloc(sizeof(struct charArr));
if(splitString == NULL){
fprintf(stderr, "malloc failedn");
exit(1);
}
splitString->size = 0;
char sep[2];
sep[0] = c;
sep[1] = (char) 0;
char* next;
while( (next = strtok( str, sep )) )
{
str = NULL;
splitString->arr[ splitString->size++ ] = next;
}
return splitString;
}

上面,我只是使用strtok. 看看 strtok(( 的手册页,看看它的细微差别。

最新更新