繁体   English   中英

如何增长一个动态的char指针数组(在C ++中)?

[英]how to grow a dynamic array of char pointers (in C++)?

我正在尝试使用char指针数组。
假设我动态声明这样的数组,如下所示:

int numrows=100;  
char** array = new char*[numrows];  

然后,我使用getline从文件中获取字符串,将字符串转换为char数组,然后在我的数组中设置一个指针,使其指向上述char数组,以填充该字符串,如下所示:

string entry;  
int i=0;
while (getline(file,entry)){  
  char* cstring = new char[entry.length()];  
  array[i]=strncpy(cstring,entry.c_str(),entry.length());  
  free(cstring);  
  i++;  
}

(这可行,但是有更好的方法吗?)
问题是,一旦我变得比数字大,我不知道如何增长数组。 我知道如何对一维数组执行此操作,但是二维使我无法接受。

我在想我应该能够像增长单维数组那样增长它,对吗?

if (i==numrows){  
  char** temp = new char*[numrows+numrows];  
  for (int j=0;j<i;j++){  
    char* cstring = new char[strlen(array[i])];  
    temp[i]=strncpy(cstrin,array[i],strlen(array[i]));  
    free(cstring);
  }
  delete [] array;
  array = temp;
}

因此,如果当前数组已满,请制作另一个数组,其大小是当前数组的两倍,并用当前数组的内容填充它。 然后删除数组,让数组指向temp。 我可以将temp设置为新数组。 我可以将array的内容放入temp,但是当我删除array并设置array = temp时,array的内容不是temp的内容。

所以我的问题是我应该/应该如何生长这个动态的char指针数组?

使用std :: vector-它是你的朋友

 std::vector<std::string> arr;
 while(getline(file, entry))
   {
       arr.push_back(entry);
  }

完成

可以使用带有自定义比较的矢量排序来完成排序

 bool less3(const std::string &s1, const std::string &s2)
 {
      return s1.compare(0, 3, s2, 0, 3) == 0;
 }

 std::sort(arr.begin(), arr.end(), less3);

我敢打赌,可以让less3更有效率,但除非您真正受苦,否则可读性会胜出

根据来自gman的好评论进行修改

除了Tyler McHenry的言论以及应该使用STL的事实外,问题很可能是您在复制了每个cstring之后释放了它。 也许您打算释放原始字符串呢?

  for (int j=0;j<i;j++){  
    char* cstring = new char[strlen(array[i])];  
    temp[i]=strncpy(cstring,array[i],strlen(array[i]));  
    delete[] array[i];
  }

首次填充数组时,请勿在字符串上调用free()。 首先,您应该使用delete [],但更重要的是,您仍然想稍后再访问该字符串,对吗?

现在我看到您说这是一个允许您使用STL的类。 禁止主要语言功能之一的c ++课堂教学! -无论如何过去

您不需要复制字符串来调整数组的大小,只需要复制指针即可。

 if (i==numrows){  
   char** temp = new char*[numrows+numrows];  
   for (int j=0;j<i;j++){  
     temp[j]=array[j];
    }
    delete [] array;
    array = temp;
 }

我确定那里还有人-留做作业

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM