我正在尝试将 argv
的各个元素复制到第二个数组中。我正在使用 strncpy
来做到这一点。
这是一个复制该问题的精简版本。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("%d\n", argc);
char *argvarray[argc];
int arrlen;
//int j;
for(int j=0; j< argc; j++){
arrlen = arrlen + strlen(argv[j]);
}
printf("size of argv: %d\n", arrlen); //see if size is right
strncpy(*argvarray, *argv, arrlen);
for(int j=0; j< argc; j++){
printf("value of j: %d\n", j); //to see what's going on
printf("%s\n", argv[j]);
printf("%s\n", argvarray[j]); //gets 1st element no problem
}
return 0;
}
如果我将 1 个 arg 传递给 main,它会将 argv 的第一个元素复制到 argvarray ,但不会复制第二个元素。如果我传递超过 1 个参数,它会在 strncpy()
上出现段错误。
为什么会发生这种情况?在事先不知道大小的情况下,将 char 数组(特别是在函数定义中声明的 char 数组)的所有元素复制到其他 char 数组(如 argv 的情况)的最佳方法是什么?
最佳答案
arrlen = arrlen + strlen(argv[j]);
arrlen
在未初始化的情况下使用(未定义的行为)。
正如 @PeterA.Schneider 所指出的,您需要为 argvarray
的每个元素提供空间,在 strncpy
或 之前使用
malloc
>strdup
关于c - strncpy 从 **char 到 *char[] 不复制最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506684/