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

0 投票
2 回答
586 浏览
提问于 2025-04-20 00:15

我正在尝试制作一个新的argv副本,然后将其传递给Python的PySys_SetArgv,但遇到了一个错误:

我的argv参数是:

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

我想制作一个新的argv副本,叫做argv_new,它包含从-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,具体是用PySys_SetArgv(argc - 4, argv_new)来设置要传递给Python的argv。然而,我遇到了以下错误:

无法将‘char (*)[6]’转换为‘char**’作为参数‘2’传递给‘void PySys_SetArgv(int, char**)’

我不确定如何修复这个错误。任何帮助都将不胜感激。

2 个回答

1

一个指针数组(像 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]);
}

(如果你更喜欢的话,可以把 strdup(s) 替换成 malloc(strlen(s)+1) + strcpy()

0

假设你只想跳过一些参数,另一种解决办法是创建一个新的数组,这个数组里存放的是指向参数字符串的指针,而不是直接复制那些实际的参数字符串:

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);

撰写回答