2013-11-07 4 views
-1

У меня есть char **argv={"ls","-l","/bin"}, и я хочу, чтобы это был массив строк, который contais "ls","-l","/bin", (char *)NULL. Я пробовал argv={*argv,(char *)NULL};, но компилятор сказал мне «ожидаемое выражение перед» {«токен». Что я должен сделать, чтобы получить его? BTW, могу ли я использовать «{}» для объявления строкового массива?добавить строку в массив строки в C

+0

то что, если я не знаю, что находится в argv? что, если он вводится пользователем? – user2951219

+0

Я думаю, что «argv», о котором здесь говорится, является их собственным, и они пишут оболочку. – paddy

+1

Знаете ли вы, что стандарт требует, чтобы 'argv [argc]' был нулевым указателем? (C99, §5.1.2.2.1/2). –

ответ

0

написать

char const *argv[] = { "ls", "-l", "/bin", NULL }; 

Если вы хотите добавить другие аргументы условно можно добавить фиктивные аргументы и заполнить их по требованию:

/* the '23' depends on the number of conditions evaluated below */ 
char const *argv[23] = { [0] = "ls", [1] = "-l", [2] = "/bin" }; 
size_t idx = 3; 

if (user_wants_a) 
    argv[idx++] = "-a"; 

Когда пользователь может добавить произвольное количество данных, вы придется выделить ARGV [] динамически:

char const **argv = calloc(<number-of-elements>, sizeof argv[0]); 

argv[0] = "ls"; 
argv[1] = "-l"; 
... 

и увеличить его по требованию:

new_argv = realloc(argv, <new-number-of-elements> * sizeof argv[0])); 
BUG_ON(!new_argv); 
argv = new_argv; 
+0

то что, если я не знаю, что в Аргве? что, если он вводится пользователем? – user2951219

+0

Я обновил ответ ... – ensc

0

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

  1. На стеке: char *argv[MAX_ARGS];
  2. На куче: char **argv = malloc(num_args * sizeof(char*));

В обоих случаях, допустим, массив заполнен значениями num_args, и вы хотите наклеить NULL на конце. В первом случае, если MAX_ARGS больше num_args+1, вы можете просто сделать это:

argv[num_args] = NULL; 

Во втором случае, это немного сложнее, потому что массив только достаточно просто большой. В этом случае вам необходимо перераспределить его сначала:

argv = realloc(argv, (num_args+1) * sizeof(char*)); 
if(argv) argv[num_args] = NULL; 

Существует третий случай, который я не рассматривал. Именно здесь argv - это тот, который был фактически предоставлен вашей функции main. В этом случае вы должны неrealloc. Вместо этого сделайте копию массива:

char *argv2 = malloc(argv, (num_args+1) * sizeof(char*)); 
if(argv2) { 
    memcpy(argv2, argv, num_args * sizeof(char*)); 
    argv2[num_args] = NULL; 
} 
+0

то что, если я не знаю длины argv? я имею в виду, что он вводится пользователем – user2951219

+0

Можете ли вы уточнить, в каком из случаев мы имеем дело? В первых двух случаях вы сами проанализировали ввод пользователя, и вы могли рассчитывать. В третьем случае он был отправлен в 'main' вместе с' argc', который содержит счетчик. – paddy

Смежные вопросы