我正在尝试实现一个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 failed\n");
exit(1);
}
splitString->size = 0;
int i = 0;
int j = 0;
while (str[i] != '\0') {
if (str[i] == c) {
splitString->arr[splitString->size][j] = '\0';
(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] = '\0';
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 failed\n");
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;
}
在像这样的简单输入上运行代码(该输入是从命令行连续获取的):
输入输入> this&that
我希望输出为:
这个那个
但是,我得到了错误:
分段故障(核心已转储)
如果输入如下所示(即连续出现分割字符):
输入Input> this &&& that
那么输出也必须是:
这个那个
编辑:我试图扩展这个分割在多个分隔符的字符串,以及(在一个GO),因此,而不是炭Ç在上述功能,如果焦炭* C被传递其为定界符的一个字符串(例如C = “ \ t \ n”从给定的字符串中删除所有空格),然后它也应该按预期工作,并在数组的分割和长度之后返回一个字符串数组。例如,如果输入为(多个空格,制表符和换行符):
Enter Input> this that
然后,返回的数组(它是返回结构的一部分)的大小必须为2,并且仅包含2个字符串-“ this”和“ that”。
自从我编写任何C语言以来已经很长时间了,所以我认为这将是一个挑战。这是stringSplitter函数的重写。
struct charArr* stringSplitter(char *str, char c){
struct charArr* splitString = (struct charArr*)malloc(sizeof(struct charArr));
if(splitString == NULL){
fprintf(stderr, "malloc failed\n");
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()的联机帮助页可以看到它的细微差别。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句