Как я могу объединить аргументы в строку в C? - PullRequest
1 голос
/ 24 августа 2011

Я сделал что-то вроде ...

str = strcpy(str, arg[1]);
str = strcat(str, " ");
str = strcat(str, arg[2]);

что если у меня есть 5 аргументов ???

как я могу это исправить ??

Ответы [ 6 ]

6 голосов
/ 24 августа 2011

Записать цикл:

char str[HUGE];
strcpy(str, argv[1]);

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

Сначала следует проверить, что argc равно как минимум 1, и было бы лучше использовать вместо этого функции с ограниченной длиной strncpy и strncatи отслеживать длину каждого аргумента.

1 голос
/ 24 августа 2011

Сначала необходимо проверить длину необходимого хранилища. Если у вас есть разные аргументы, правильный ответ - использовать цикл.

int i;
int needed = 1;                        // plus end of string mark

for(i = 1; i < argc; ++i) {
    needed += strlen( argv[ i ] ) + 1; // plus space
}

Затем необходимо зарезервировать необходимый объем памяти и, используя другой цикл, объединить строки:

char * storage = (char *) malloc( sizeof( char ) * needed );

strcpy( storage, argv[ 1 ] );

for( i = 2; i < argc; ++i) {
    strcat( storage, " " );
    strcat( storage, argv[ i ] );
}

И, наконец, используйте пробел и освободите его.

printf( "%s\n", storage );
free( storage );

Надеюсь, это поможет.

1 голос
/ 24 августа 2011

Петли FTW

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

Имейте в виду, это добавит завершающий пробел в конце. Вы можете удалить его, вставив символ NUL в этой позиции. Также не забудьте выделить достаточно места в буфере str и поставить завершающий символ NUL.

0 голосов
/ 11 февраля 2013
#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[])
{
  int i;
  int len = 0;
  char *str = "";
  for(i=1; i<argc; i++)
  {
    len += strlen(argv[i]) + 1;
  }
  str = (char *)malloc(sizeof(char) * len);
  for(i=1; i<argc; i++)
  {
    strcat(str, argv[i]);
    strcat(str, " ");
  }
  printf("str = [%s]\n", cmds);
  return 0;
}
0 голосов
/ 24 августа 2011

Вам не нужно присваивать возвращаемое значение str. Также, если ваша строка хранится в статическом массиве, это не правильно.

С помощью приведенной ниже конструкции вы можете объединять, как хотите.

char str[MAX];

strcpy (str, "");

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

здесь argc содержит количество элементов max. Обратите внимание, что MAX должно быть достаточно большим, чтобы вместить все соединенные строки. Вы также можете сделать

char *str;
str = malloc (sizeof (char) * MAX);

для динамического выделения памяти. При таком распределении не забудьте освободить выделенную память после завершения работы со строкой.

0 голосов
/ 24 августа 2011

Вы можете сделать цикл над массивом arg. Нравится

strcpy(str, arg[1]);
strcat(str, " ");

for ( i = 2; i < arg_array_size; i++ )
{
   strcat(str, arg[i]);
   strcat(str, " ");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...