Вы можете трактовать argv[1]
, как если бы это был массив char
(т.е. вы можете использовать его как argv[1][i]
). Вы можете передать его в качестве аргумента любой функции, которая не пытается ее изменить (например, printf
, strtol
, strchr
и т. Д.). Вы не можете записать в нее, однако, поэтому, если вам нужно изменить содержимое по любой причине (напрямую или с помощью функции, такой как strtok
или strcpy
), вам придется создать локальный копировать и манипулировать этим.
Если вы используете C89 или более раннюю версию, используйте этот метод:
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char *c = NULL;
if (argc >= 2)
{
c = malloc(strlen(argv[1]) + 1);
strcpy(c, argv[1]);
}
/**
* Do stuff with c
*/
free(c);
return 0;
}
Если вы используете C99, вы можете использовать VLA:
#include <string.h>
int main(int argc, char **argv)
{
if (argc < 2)
return 0;
size_t len = strlen(argv[1]);
char c[len+1];
strcpy(c, argv[1]);
/**
* do stuff with c
*/
return 0;
}
Просто запомните несколько вещей:
Тип из argv
равен char **
, не char *[N]
; аналогично тип argv[i]
равен char *
, а не char [M]
. В большинстве случаев это не имеет значения; Вы можете использовать оператор индекса для указателя , как если бы был массивом (индексирование массива определено в терминах арифметики указателей), но помните, что указатели и массивы не являются одно и то же и не всегда взаимозаменяемы;
Значение из argv[argc]
всегда NULL
;
За исключением случаев, когда он является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым в качестве инициализатора в объявлении, выражение типа массива преобразуется ("распадается") из "массива N-элементов из T" в "указатель на T", а значение выражения является местоположением первого элемента;
C не имеет строкового типа данных как такового; строки представлены в виде 0-концевых последовательностей char
. Строковые литералы, такие как "hello"
, хранятся таким образом, что они существуют на протяжении всей жизни программы, и вы можете получить к ним доступ через значение указателя; Попытка изменить их приводит к неопределенному поведению (то есть не делать этого).