将argv转换为新数组

时间:2015-06-04 14:05:46

标签: c++ arrays

我无法弄清楚为什么这段代码不起作用。我见过this,但我仍然没有得到它。我收到了分段错误(11),并且看不到MemoryCache打印的argv数组。

到目前为止我的代码

testArray

2 个答案:

答案 0 :(得分:9)

在您的代码中,更改

  for (int i=0; argc; i++){

  for (int i=0; i < argc; i++){

否则,显然没有对for循环进行条件检查(argc>= 1并且通常不变),将其转换为< em>无限循环。

FWIW,此i的未绑定增量会导致testArray[i]访问导致undefined behaviour的超出内存。

那就是说,还有更多的事要让你烦恼。没有什么叫做c和c ++代码。它们是非常不同的,应该是这样的。请不要混淆它们。他们每个人都有自己的优点/缺点,使用适合你的,但不能同时使用代码。

现在,关于数组的复制,argv是指向argv[i]的指针,它包含命令行参数。 *argv[i]不会一次提供整个数组,它只指向argv[i]数组中的第一个元素。所以,

 testArray[i] = *argv[i];

不会复制数组。要复制它,

在C

  1. 您需要分配大小为strlen(argv[i]) + 1
  2. 的缓冲区
  3. 使用strcpy()argv[i]复制到缓冲区。
  4. 在C ++中

    您需要使用std::copy()

答案 1 :(得分:1)

之前的答案是正确的,但是,您的代码中还有另一个错误。 char testArray[argc]实际上不是一个字符串数组,而是一个字符数组(也就是一个字符串)。所以你在这里做什么

testArray[i] = *argv[i];

有效,但它只将每个参数的第一个字符复制到testArray。我认为这不是你想要的。

要理解这一点,您必须了解指针的工作原理。 char** argv是一个双指针。这意味着它指向argc指针列表。因此,如果您的程序有两个参数,那么您的argv将指向内存中存在三个指针列表的位置。这三个指针分别指向存储器中存储相应参数的某个位置。要了解指针,最简单的方法是在youtube上搜索pointers c

因此,要复制它们,您应该使用strcpy

或者您只能复制指针。

char* myArgv[argc];
myArgv[0]=argv[0];
myArgv[1]=argv[1];
//etc until argc

这样可行,但你不会自己复制参数,只是指向它们的指针。