Есть несколько проблем, которые были указаны в комментариях:
В третьем цикле код использует cutindex + 1
для индексации в массиве argv
. Но цикл не изменяется cutindex
, поэтому первый аргумент после «cut» (в данном примере «amy») повторяется для всего массива.
Выходные массивы argv1
и argv2
должны быть массивами указателей.
Одним из решений первой проблемы является использование отдельного индекса для каждого массива. Таким образом, вы можете увеличивать каждый индекс по мере необходимости, и вам не нужно пытаться вычислять индексы математически.
Дополнительным преимуществом является то, что когда код завершен, конечное значение каждого выходного индекса - это число элементов в соответствующем выходном массиве.
Еще одним дополнительным преимуществом является то, что вы можете ограничить количество элементов, записываемых в массив. Обратите внимание, что в приведенном ниже коде любые аргументы после первых 10 молча отбрасываются. В реальном коде вы можете предупредить пользователя, что он ввел слишком много аргументов.
#include <stdio.h>
#include <string.h>
#define MAX_ARG 10
int main(int argc, char *argv[])
{
char *argv1[MAX_ARG]; // first array of arguments
int n1 = 0; // index into first array
char *argv2[MAX_ARG]; // second array of arguments
int n2 = 0; // index into second array
// copy pointers into the first array until "cut" is found
int i;
for (i = 1; i < argc; i++)
{
if (strcmp("cut", argv[i]) == 0)
break;
if (n1 < MAX_ARG)
argv1[n1++] = argv[i];
}
// copy any remaining pointers into the second array
for (i++; i < argc; i++)
{
if (n2 < MAX_ARG)
argv2[n2++] = argv[i];
}
// print the arrays
for (int i = 0; i < n1; i++)
printf("argv1[%d] = '%s'\n", i, argv1[i]);
putchar('\n');
for (int i = 0; i < n2; i++)
printf("argv2[%d] = '%s'\n", i, argv2[i]);
}
при запуске с командной строкой
./a.out andy bob charlie ned cut amy sophie anna
вывод этого кода
argv1[0] = 'andy'
argv1[1] = 'bob'
argv1[2] = 'charlie'
argv1[3] = 'ned'
argv2[0] = 'amy'
argv2[1] = 'sophie'
argv2[2] = 'anna'