假设我有char **argv
,那么argv[0] = some string
和argv[1] = another string
等......
我在结构中有另一个双指针字符串数组,在结构中调用它s1->argv
也定义为char **argv
。
我正在尝试将argv
复制到s1->argv1
。我尝试malloc
s1->argv
strcpy
到具有最大值的内容(所以7个字符串,每个字符串最多100个字符)并使用argv[0]
,但这显然不起作用。它最终只会复制strcpy(*s1->argv, *argv)
。这就是我使用它的方式:{{1}}
我如何保留数组的每个索引呢?
答案 0 :(得分:0)
下面的代码会将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]);