Храните argv [] в двух массивах, разделенных специальной строкой (C) - PullRequest
1 голос
/ 22 мая 2019

Я хочу прочитать аргументы из командной строки и сохранить их в двух массивах. Разделение между массивами будет обозначаться как «вырезать».

Пример: a.out, Энди Боб Чарли Нед Кат, Эми Софи Энна

массив1 будет {Энди, Боб, Чарли, Нед}

array2 будет {amy, sophie, anna}

Я нашел argc слова "вырезать". Затем я запустил цикл от 0 до этого индекса для первого массива. У меня проблемы со вторым массивом.

int cutindex, i;

for(i=1; i<argc; i++) {
  if(strcmp("cut", argv[i]) == 0){
    cutindex = i;
  }
}

char argv1[10];
for(i=0; i<cutindex-1; i++) {
  argv1[i] = argv[i+1];
}

char argv2[10];
for(i=0; i<argc-cutindex-1; i++) {
  argv2[i] = argv[cutindex+1];
}

Для второго массива я получаю повторение первого значения (amy) для всего массива. Что я делаю не так?

Во-первых, есть ли лучший (более эффективный) способ сделать это?

1 Ответ

1 голос
/ 22 мая 2019

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

  1. В третьем цикле код использует cutindex + 1 для индексации в массиве argv. Но цикл не изменяется cutindex, поэтому первый аргумент после «cut» (в данном примере «amy») повторяется для всего массива.

  2. Выходные массивы 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...