Копирование строк с двумя указателями - PullRequest
1 голос
/ 14 марта 2012

Предположим, у меня есть char **argv, так что argv[0] = some string и argv[1] = another string и т.д ...

У меня есть еще один массив строк с двойным указателем в структуре, назовите его s1->argv, также определенным как char **argv внутри структуры.

Я пытаюсь скопировать argv в s1->argv1.Я попытался malloc ing s1->argv для чего-то с максимальным значением (таким образом, 7 строк, каждая строка из 100 символов) и использованием strcpy, но это, очевидно, не работает.Это только заканчивается копирование argv[0].Вот как я это использовал: strcpy(*s1->argv, *argv)

Как мне сохранить каждый индекс массива тоже?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Похоже, вы просто хотите скопировать все argv в другое значение char**. Если это так, то выполните следующее

char** copy_all(char** argv, int length) {
  char** ppDest = malloc(sizeof(char**) * length);
  if (!ppDest) {
    return NULL;
  }

  int i = 0;
  for (i < length; i++) {
    char* pCurrent = argv[i];
    size_t currentLength = strlen(pCurrent);
    ppDest[i] = malloc(currentLength + 1);
    if (!ppDest[i]) {
      goto Error;
    }
    strcpy(ppDest[i], argv[i]);
  }

  return ppDest;

Error:
  while (i > 0) {
    free(ppDest[i - 1]);
    i--;
  }
  free(ppDest);
  return NULL;
}
0 голосов
/ 14 марта 2012

Приведенный ниже код копирует argc и argv аргументы main в пользовательскую структуру. Копия точно такая же, как и исходные аргументы (argv заканчивается NULL, как в main). Этот код не обрабатывает какие-либо ненормальные события (такие как сбои malloc, прерывание сигнала и т. Д.).

Возможно, вы захотите избежать применения результата malloc (это не требуется в C), существует много споров о том, является ли это приведение хорошим или плохим. Выбор за вами. Я больше ценю переносимость, поэтому я выбираю приведение, компиляцию со всеми включенными предупреждениями и исключаю все из них в коде (см. Комментарии к этому ответу).

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

struct my_struct
{
    int    argc;
    char** argv;
};

int main(int argc,char** argv)
{
    int    i = 0;
    size_t n = 0;
    struct my_struct s;

    memset(&s,0,sizeof(s));
    s.argc = argc;
    /* alloc one more element than 'argc' to terminate 's.argv' with NULL */
    s.argv = (char**)malloc((argc + 1) * sizeof(char*));
    /* terminate 's.argv' with NULL exactly as 'argv' in 'main' */
    s.argv[argc] = NULL; 
    for(i = 0; i < argc; ++i)
    {
        n = strlen(argv[i]) + 1;
        s.argv[i] = (char*)malloc(n);
        strcpy(s.argv[i],argv[i]);
    }
    return 0;
}

Другим вариантом копирования строк в argv может быть использование функции strdup, тогда вы можете заменить три строки:

n = strlen(argv[i]) + 1;
s.argv[i] = (char*)malloc(n);
strcpy(s.argv[i],argv[i]);

с

s.argv[i] = strdup(argv[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...