Что если у меня более 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](https://i.stack.imgur.com/P4sQR.jpg)
Пример вывода Использование аргументов с пробелами:
«это то» и «другое» и, в конце концов, длинный аргумент в пользу того, что татарский тракт может содержать
РЕДАКТИРОВАТЬ для уточнения комментариев.
Следующий тест для (и ограничения) максимального числа аргументов до 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](https://i.stack.imgur.com/Foiq6.jpg)