Вот решение, которое не включает динамическое выделение памяти.
Прежде чем углубляться в детали ...
Я думаю, что для решения такой проблемы полезно подумать о том, как «строки» хранятся в памяти. Это может выглядеть примерно так, как на картинке. (Адреса памяти совершенно нереалистичны - и в конце каждой строки будут нулевые терминаторы - но вы поняли).
Как показано на рисунке, жизненно важная информация, которая нам нужна для каждого «подмассива», может храниться в паре <char **, int>
. char **
- это адрес первой «строки» в подмассиве; int
- это количество строк в нем.
Мы можем использовать struct string_array_t
для хранения этой информации.
typedef struct {
// Pointer to first string in sub-array
char **p;
// Number of strings in sub-array
int count;
} string_array_t;
Мы размещаем массив этих в стеке ; таким образом, нет необходимости в malloc()
или free()
- до тех пор, пока мы выделяем достаточно подмассивов.
string_array_t string_arrays[MAX_SUB_ARRAYS] = {0};
char *input[] = {"hello", "I", "am", "|", "a", "cool", "|", "guy"};
// Pointer to current sub-array
string_array_t *cur = NULL;
size_t n_sub_arrays = 1;
Инициализировать наши счетчики и указатели:
int i = 0, j = 0, k = 0;
cur = &string_arrays[0];
size_t n_strings_total = sizeof(input) / sizeof(input[0]);
Затем переберите массив.
for (i = 0; i < n_strings_total; i++) {
if (!strcmp(input[i], "|")) {
// Store total number of strings in this sub-array
cur->count = k;
k = 0;
// Switch to next sub-array
cur = &string_arrays[++j];
if (j >= MAX_SUB_ARRAYS) {
fprintf(stderr, "Not enough sub-arrays allocated ...\n");
break;
}
n_sub_arrays++;
continue;
}
if (k == 0) {
cur->p = &input[i];
}
k++;
}
cur->count = k;
Распечатать результаты.
printf("Found %zu sub arrays ...\n", n_sub_arrays);
for (i = 0; i < n_sub_arrays; i++) {
string_array_t *cur = &string_arrays[i];
for (j = 0; j < cur->count; j++) {
printf("%s ", *(cur->p++));
}
printf("\n");
}