Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 复制双指针字符串_C_String_Pointers - Fatal编程技术网

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
ing
s1->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]);