我一直在努力弄清楚这个任务已经好几个小时了,但还是无法掌握它。我正在尝试从txt文档读取名称,这是有效的,我需要将它们存储在char指针数组中。一旦名称的数量与数组大小一样大,我需要使用REALLOCATION来使数组更大(我不能使用向量库)。
我正在努力改变名称数组大小以使其更大并从内存中删除旧数组(当我写delete []名称时它只会崩溃;)。
这是我目前破解的代码:
int numNames = 2;
char * names[numNames] = {};
ifstream namesFile("names.txt");
//get names from user, put names in ragged array
int i = 0;
while (i < numNames) {
if (namesFile.good() && !namesFile.eof()) {
//add name to ragged array
names[i] = new char[257];
namesFile >> setw(256) >> names[i];
i++;
if (i == numNames) {
//need a bigger array
numNames *= 2;
char * temp[20] = {};
for (int j = 0; j < numNames / 2; j++) {
temp[j] = names[j];
}
delete [] names;
names = temp;
}
}
else {
//end of file or corrupt file
break;
}
}
namesFile.close();
感谢任何帮助!
答案 0 :(得分:-1)
以下语句不执行任何动态分配。它只是在大小为pointers to char (char*)
的堆栈上声明了一个numNames
数组。所以,它无论如何都不是动态的:
char * names[numNames] = {};
因此,您无法更改其大小。
相反,您需要为数组创建指针,如下所示:
char **names = new (char*)[numNames];
你的temp
路过同样的故事。现在您可以自由删除/ new并分配指针:names = temp
。
现在,您需要逐行读取文件中的char数据并将其放在“names”数组中。当你读取一个字符串时,你可以在数组成员中为它分配空间,即
names[i] = new char [strlen(inputString) + 1]; // you need '+1' for termination char
您可以在分配后复制字符串中的数据,即
strcpy(name[i], inputString); // this is a standard 'c' string copy
你也可以使用std::copy
或for循环做副本或其他什么。另一种方法是使用标准的'c'malloc
函数进行分配:
name[i] = (char *)malloc(strlen(inputString) + 1);
不同之处在于,当您需要释放内存时,您将在第一种情况下使用delete[] name[i]
,在第二种情况下使用free(name[i])
。虽然看起来你不需要在任务中释放内存。
现在你只需要弄清楚如何从文件中读取。