Как разбить массив указателей char на два массива указателей char

Мой вопрос в том, как я могу разделить argv на две части и сохранить части в двух переменных.

Я хочу, чтобы моя программа получала параметры, затем разделитель, а затем снова такие параметры:

./program parameter1 parameter2 \: parameter3 parameter4

Как видите, экранированный ':' будет действовать как разделитель, разрезая массив на две части. Теперь я хочу получить char *arr1[], который будет содержать parameter1 и parameter2, и еще один char *arr2[], который будет содержать parameter3 и parameter4. Параметры могут быть разной длины.

Как я могу разделить argv и сохранить различные параметры на два char *[]? В конце концов, я хочу получить доступ (имея в виду мой пример) arr1[0], и внутри него должна быть строка parameter1, а внутри arr1[1] должна быть строка parameter2.

Редактировать: Проблема заключается в сохранении параметров в двух разных char *arr[]. Я не знаю, как это сделать, потому что я знаю только, как инициализировать массив значением.

char *arr1[]; !error
char *arr1[10]; works, but what if I have more than 10 parameters?

Заранее спасибо!

🤔 А знаете ли вы, что...
C используется для создания множества приложений, включая игры, базы данных, браузеры и многое другое.


25
1

Ответ:

Решено

Не! Это все указатели. Вместо этого используйте указатели — начальный указатель и конечный указатель или начальный указатель и количество элементов — для представления «диапазона» внутри исходного массива.

char **arr1 = &argv[1];
char **arr1end = arr1;
while (*arr1end != NULL) {
    if (strcmp(*arr1end, ":") == 0) {
         break;
    }
    arr1end++;
}
if (arr1end == NULL) { /* handle error - user did not give : argument */ }
size_t arr1cnt = arr1end - arr1;
// Array arr1 has arr1cnt elements.

char **arr2 = arr1end + 1;
char **arr2end = arr2;
while (*arr2end != NULL) {
    ++arr2end;
}
size_t arr2cnt = arr2end - arr2;
// arr2cnt represents arguments after `:`.

for (size_t i = 0; i < arr1cnt; ++i) {
      printf("arr1[%zu]=%s\n", i, arr1[i]);
}
for (size_t i = 0; i < arr2cnt; ++i) {
      printf("arr2[%zu]=%s\n", i, arr2[i]);
}