У меня есть char **argv={"ls","-l","/bin"}
, и я хочу, чтобы это был массив строк, который contais "ls","-l","/bin", (char *)NULL
. Я пробовал argv={*argv,(char *)NULL};
, но компилятор сказал мне «ожидаемое выражение перед» {«токен». Что я должен сделать, чтобы получить его? BTW, могу ли я использовать «{}» для объявления строкового массива?добавить строку в массив строки в C
ответ
написать
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;
то что, если я не знаю, что в Аргве? что, если он вводится пользователем? – user2951219
Я обновил ответ ... – ensc
Если вы разборе значения в массив из пользовательского ввода, Вы, вероятно, выделяется ваш массив в одном из двух способов:
- На стеке:
char *argv[MAX_ARGS];
- На куче:
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;
}
то что, если я не знаю длины argv? я имею в виду, что он вводится пользователем – user2951219
Можете ли вы уточнить, в каком из случаев мы имеем дело? В первых двух случаях вы сами проанализировали ввод пользователя, и вы могли рассчитывать. В третьем случае он был отправлен в 'main' вместе с' argc', который содержит счетчик. – paddy
- 1. C# добавить строку в массив
- 2. Добавить строку в массив char в C
- 3. cant добавить строку в список строки C#
- 4. C++ Как добавить строку в массив BYTE?
- 5. Numpy - добавить строку в массив
- 6. Добавить строку в массив
- 7. C# массив большой строки в строку
- 8. Как добавить строку в массив?
- 9. Как добавить строки в массив
- 10. Как добавить строку в 2D-массив в C
- 11. Как добавить строку в массив строк в C
- 12. Как добавить строку в массив?
- 13. PHP - Добавить строку в массив
- 14. Добавить строку в массив PHP
- 15. C# помещать строку в массив
- 16. Добавление строки строки в строку в C#
- 17. Добавить массив строк в строку в Swift
- 18. Вставить строку в строку [] массив в C#
- 19. C# Как добавить строковые элементы в массив в строку
- 20. Как добавить строку в массив строк в c?
- 21. как добавить новую строку в такой массив в C#
- 22. Как добавить массив в строку SQL в C#?
- 23. Как добавить динамически выделенную строку в массив строк в C?
- 24. разбить строку в массив и добавить разделитель в массив
- 25. C++ Добавить объект в массив
- 26. Как добавить строки в массив в Python?
- 27. Манипулировать массив символов как строку в c
- 28. Массив строки в c
- 29. Добавить новую строку массив в вар строки списка
- 30. C# Преобразование строки в массив
то что, если я не знаю, что находится в argv? что, если он вводится пользователем? – user2951219
Я думаю, что «argv», о котором здесь говорится, является их собственным, и они пишут оболочку. – paddy
Знаете ли вы, что стандарт требует, чтобы 'argv [argc]' был нулевым указателем? (C99, §5.1.2.2.1/2). –