Объединить все аргументы (кроме имени исполняемого файла) - PullRequest
1 голос
/ 27 июня 2010

Существует ли функция C, которая может объединить все переданные аргументы (кроме имени исполняемого файла) в char* и вернуть его?

Ответы [ 4 ]

5 голосов
/ 27 июня 2010

Попробуйте это:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    unsigned int i;
    size_t len = 0;
    char *_all_args, *all_args;

    for(i=1; i<argc; i++) {
        len += strlen(argv[i]);
    }

    _all_args = all_args = (char *)malloc(len+argc-1);

    for(i=1; i<argc; i++) {
        memcpy(_all_args, argv[i], strlen(argv[i]));
        _all_args += strlen(argv[i])+1;
        *(_all_args-1) = ' ';
    }
    *(_all_args-1) = 0;

    printf("All %d args: '%s'\n", argc, all_args);

    free(all_args);

    return 0;
}
3 голосов
/ 27 июня 2010

с чего бы это? Просто используйте strcat в цикле.

1 голос
/ 27 июня 2010

Я не думаю, что есть такая функция, но если я не ошибаюсь, вам просто нужно:

  • получить длину: len = strlen(argv[1]) + strlen(argv[2]) + ... и проверить на переполнение
  • использовать malloc: malloc(len + 1) * sizeof(char))
  • установить your_copy [0] на '\ 0'
  • использовать strcat(your_copy, argv[1]), strcat(your_copy, argv[2]) ... для каждого оставшегося аргумента []

РЕДАКТИРОВАТЬ: О, предыдущий ответ может быть лучше.;)

1 голос
/ 27 июня 2010

Как то так? Нет гарантий, что это скомпилируется.

#include <string.h>
#include <stdio.h>

int main(int argc, char ** argv) {
  int i;
  int len = 1;
  char * str;

  for (i = 1; i < argc; i++) {
     len += strlen(argv[i]);
  }

  str = malloc(sizeof(char)*len);
  str[0] = '\0';

  for (i = 1; i < argc; i++) {
     strcat(str, argv[i]);
  }

  //Use str for whatever you want
  printf("My string is %s\n", str);

  free(str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...