复制双指针字符串

时间:2012-03-13 22:41:38

标签: c string pointers

假设我有char **argv,那么argv[0] = some stringargv[1] = another string等......

我在结构中有另一个双指针字符串数组,在结构中调用它s1->argv也定义为char **argv

我正在尝试将argv复制到s1->argv1。我尝试malloc s1->argv strcpy到具有最大值的内容(所以7个字符串,每个字符串最多100个字符)并使用argv[0],但这显然不起作用。它最终只会复制strcpy(*s1->argv, *argv)。这就是我使用它的方式:{{1}}

我如何保留数组的每个索引呢?

1 个答案:

答案 0 :(得分:0)

下面的代码会将argc argv main个参数的副本复制到用户定义的结构中。副本与原始参数完全相同(argvNULL终止,如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]);