C 复制双指针字符串
假设我有C 复制双指针字符串,c,string,pointers,C,String,Pointers,假设我有char**argv,因此argv[0]=某个字符串和argv[1]=另一个字符串等等 我在结构中有另一个双指针字符串数组,称它为s1->argv,在结构中也定义为char**argv 我正在尝试将argv复制到s1->argv1中。我尝试了mallocings1->argv到一个最大值(因此有7个字符串,每个字符串最大100个字符)并使用strcpy,但这显然不起作用。它只会复制argv[0]。我就是这样使用它的:strcpy(*s1->argv,*argv) 如何保存数组的每个索引呢
char**argv
,因此argv[0]=某个字符串
和argv[1]=另一个字符串
等等
我在结构中有另一个双指针字符串数组,称它为s1->argv
,在结构中也定义为char**argv
我正在尝试将argv
复制到s1->argv1
中。我尝试了malloc
ings1->argv
到一个最大值(因此有7个字符串,每个字符串最大100个字符)并使用strcpy
,但这显然不起作用。它只会复制argv[0]
。我就是这样使用它的:strcpy(*s1->argv,*argv)
如何保存数组的每个索引呢?听起来您只是想将整个
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;
}
char**copy\u all(char**argv,int-length){
char**ppDest=malloc(sizeof(char**)*长度);
如果(!ppDest){
返回NULL;
}
int i=0;
对于(i0){
免费(ppDest[i-1]);
我--;
}
免费(ppDest);
返回NULL;
}
下面的代码将argc
和argv
的main
参数复制到用户定义的结构中。副本与原始参数完全相同(argv
与main中一样以NULL
终止)。此代码不处理任何异常事件(如malloc故障、信号中断等)
您可能希望避免使用malloc
(在C中不是必需的)来强制转换结果,对于这种强制转换是好是坏有很多争论。选择权在你。我更看重可移植性,所以我选择强制转换、编译并启用所有警告,并在代码中消除所有警告(请参阅此答案的注释)
与
是否有任何不在
main
中执行s->argv=argv
的原因?你想修改副本吗?不是真的。。。但我可能必须将其传递给其他一些函数。那还能用吗?你可能想要malloc
currentLength
+1字节的ppDest[i]
@AusCBloke-doh,我因那个错误而让学生们停课的次数,我还是忍不住自己动手这只是一个例子,不是洲际导弹控制代码。如果malloc失败,那么(在大多数情况下)只能中止。如果你的机器在执行代码时被陨石击中了呢?我认为C标准不包括陨石的影响还没有,但是我怀疑C++标准化委员会的成员可能已经在做它了:“除非你写C++,否则不要把代码< Mulalc < /Cord> >。Alex Reynolds:我知道你不必做,但不做它不必要,这意味着它是一件好事。当您显式转换指针并使用'-Wall'(gcc)编译时,它有助于避免许多严重错误。此外,它使代码的读者清楚地了解您的意图。
#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;
}
n = strlen(argv[i]) + 1;
s.argv[i] = (char*)malloc(n);
strcpy(s.argv[i],argv[i]);
s.argv[i] = strdup(argv[i]);