将argv的元素复制到一个新数组中

copying elements of argv into a new array

本文关键字:一个 新数组 数组 argv 元素 复制      更新时间:2023-10-16

我正在尝试制作argv的新副本,然后将其传递给python PySys_SetArgv,在那里我得到一个错误:

我的argv论点是:

./matrix -r 2 -c 2 -MIN 0 -MID 10 -UPPER 50 -MAX 100

我想制作一个名为argv_new的argv的新副本,其中包含从-MIN开始到100结束的参数。我完成如下:

char argv_new[argc-4][6];
strcpy(argv_new[0],argv[0]);
cout << argv_new[0] << "n";    
for(int j=5; j<argc; j++)
{
    strcpy(argv_new[j-4],argv[j]);
    cout << argv_new[j-4] << "n";
}

我的输出如下:

./matrix
-MIN
0
-MID
10
-UPPER
50
-MAX
100

接下来,我尝试将这个argv_new传递到PySys_SetArgv as PySys_SetArgv(argc - 4, argv_new),以设置要传递给python的argv。然而,我得到以下错误:

无法转换‘char (*)[6]’ to ‘char**’ for argument ‘2’ to ‘void PySys_SetArgv(int, char**)’

我不知道如何纠正这个错误。任何帮助都将不胜感激。

指针数组(如argv)和二维数组是不同的。在第一种情况下,argv[0]、argv[1]等是可以指向完全不同地址的实际指针,在第二种情况下是一个连续的内存块,其中索引仅作为起始地址的偏移量读取。因此,不可能成功地将其中一个铸造成另一个。

要复制argv,我们必须这样做:

char *argv_new[argc-4];
argv_new[0] = strdup(argv[0]);
for(int j=5; j<argc; j++)
{
    argv_new[j-4] = strdup(argv[j]);
}

(如果您愿意,可以用malloc(strlen(s)+1)+strcpy()替换strdup(s)

假设您只想跳过一些参数,另一个解决方案是构建一个指向参数字符串的新指针数组,以传递给它,而不是复制实际的参数字符串:

char *argv_new[argc-4];
argv_new[0] = argv[0];
for(int j=5; j<argc; j++)
    argv_new[j-4] = argv[j];
PySys_Argv(argc-4, argv_new);