Заполнение массива параметрами командной строки - PullRequest
0 голосов
/ 04 января 2019

Мне нужно заполнить массив [2] [8] несколькими словами, переданными в качестве параметров командной строки (слова должны быть разделены пробелом). Я не знаю, как связать CLP с моим массивом. Что делать, если у меня более 17 букв?

Я написал код только для подсчета и печати параметров.

#define ROWS 2
#define COLUMNS 8
int main(int argc, char const *argv[])
{
  int counter;
  if(argc > 17)
  {
     printf("Too many elements!");
     return 0;
  }
  printf("Command line includes %d parameters:\n", argc - 1);
  for(counter = 1; counter < argc; counter++)
  printf("%d: %s\n", counter, argv[counter]);
  return 0;
}

РЕДАКТИРОВАТЬ: я должен использовать указатели. Массив [2] [8] должен быть заполнен словами, после которых мы ставим пробел. Я думаю, что массив 2х8 хранит ровно 16 символов, включая пробелы. Я не знаю, как показать, когда вы превышаете 16 букв.

1 Ответ

0 голосов
/ 04 января 2019

Что если у меня более 17 букв?

argc является сокращением количество аргументов , поэтому оператор: if(argc > 17) фактически проверяет количество аргументов командной строки, а не количество символов в каждом.

Кроме того, аргумент char *argv[] (где argv является коротким для вектора аргумента ) вводится с учетом любого числа char для каждого аргумента командной строки.

Заполнение массива параметрами командной строки
Если вы хотите записать содержимое аргументов командной строки в массив, либо динамически размещенный набор буферов, либо, предпочтительно, массив переменной длины (доступно с C99 и далее) подходят для задачи. Размеры массива (любого типа) можно получить, используя argc (количество аргументов) и strlen из argv[i] в цикле, чтобы получить самую длинную длину всех аргументов. Пример этой техники обращается к вашему заглавному вопросу ниже.

Пример использования VLA :

int main(int argc, char const *argv[])
{
  int counter;
  int len, maxLen=0;

  // find the longest length parameter
  for(counter = 0; counter < argc; counter++)
  {
      len = strlen(argv[counter]);
      if(len > maxLen) maxLen = len;
  }

  //using a variable length array, create a container for all parameters
  char array[argc][maxLen + 1];// +1 to allow room for null terminator

  // transfer contents of argv to VLA array
  for(counter = 0; counter < argc; counter++)   
  {
      strcpy(array[counter], argv[counter]);//copy CLPs into array
  }

  printf("Command line includes %d parameters:\n", argc - 1);
  for(counter = 1; counter < argc; counter++)
  printf("%d: %s\n", counter, array[counter]);
  return 0;
}

Пример вывода для аргументов " this, и другое, и вообще длинный аргумент для показа thargvcanaccomodate .
enter image description here

Пример вывода Использование аргументов с пробелами:
«это то» и «другое» и, в конце концов, длинный аргумент в пользу того, что татарский тракт может содержать
enter image description here

РЕДАКТИРОВАТЬ для уточнения комментариев.

Следующий тест для (и ограничения) максимального числа аргументов до ROWS, и позволяет пределам длины аргументов превышать COLUMNS-1, но обрезается до длины, если слишком длинный. Если длина строки меньше, чем COLUMNS-1, оставшееся место на пробелах добавляется &. Если строка содержит пробел, замените его на & ...

#define ROWS 2
#define COLUMNS 8
int main(int argc, char const *argv[])
{
  int counter, i;

  char array[ROWS][COLUMNS];

  if(argc > 3) 
  {
      printf("Too many arguments.  2 max.\n(Hit any character to exit.)");
      getchar();
      return 0;
  }


  for(counter = 0; counter < argc-1; counter++) 
  {   //trim to legal string length.
      strncpy(array[counter], argv[counter+1], COLUMNS-1);
      array[counter][COLUMNS-1]=0;//set last char to null
      for(i=0;i<COLUMNS-1;i++)
      {   //test for any white space or NULL 
          //character within legal string length
          if((isspace(array[counter][i])) || array[counter][i] == NULL) array[counter][i] = '&';
      }
  }

  printf("Command line includes %d parameters:\n", argc - 1);
  for(counter = 0; counter < argc-1; counter++)
  printf("%d: %s\n", counter, array[counter]);
  return 0;
}

Результаты примера параметров - echo.c "c язык в порядке" :
enter image description here

...