【发布时间】:2010-02-16 21:43:42
【问题描述】:
我正在尝试使用 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++;
}
(这可行,但有更好的方法吗?)
问题是,一旦 i 大于 numrows,我不知道如何增长数组。
我知道如何为一维数组执行此操作,但二维性让我失望。
我想我应该能够像你增长一维数组一样增长它,对吧?
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::string>?也不要不要在您使用new分配的内容上调用free。当您使用new分配时,您必须始终使用delete(或delete[])解除分配。使用free是未定义的行为。 -
好吧,一旦我读取了所有数据,我需要根据排序键对其进行排序(即从字符 1 到 3);我开始使用 string 类,但每当我必须通过将它们解析为 cstrings 并比较指定区域来比较两个字符串时,它会大大降低我的程序速度。
-
深入阅读后,这段代码有很多问题。重新分配数组是最少的问题。您需要对指针的工作原理进行基本审查。
-
@zebraman,了解
std::string的成员如何帮助您完成这项任务要比尝试在 C++ 中执行这些 C 风格的杂技要容易得多。最好将您的排序问题作为一个单独的问题发布。 -
你应该使用 std::string 的 std::vector,然后你应该使用 std::sort。