确定。因此,该程序应该以未知长度读取未知数量的名称,并且一旦用户按空白行上的回车键,就应该停止读取名称。在我看的每个地方,有人说使用矢量。但是,这适用于特别需要动态数组的赋值。到目前为止,程序将读取第一个名称,然后当您输入第二个名称时,它将崩溃。它与我如何启动/分配数组有关吗?任何帮助都会非常感激,因为这件事困扰了我好几天。
#include <iostream>
using namespace std;
int main ()
{
long numnames=0
long namelength=0;
char ** pNames;
pNames = new char* [numnames];
pNames [numnames] = new char [namelength];
char c;
bool cont=true;
while(cont)
{
while ((c=cin.get())!='\n') // input loop
{
pNames [numnames] [namelength++]=(c);
}
pNames[numnames] [namelength]='\0'; // end of string mark
if(c='\n' && namelength==0) //if enter is pressed on an empty line, stop reading names
cont=false;
else
{
numnames++;
namelength=0;
}
}
cout<<pNames<<endl; // used as a progress marker
for(int i=0; i<=numnames; i++) // mem clear loop
delete [] pNames [i];
delete [] pNames;
return 0;
}
答案 0 :(得分:0)
好像你试图通过改变'numnames'的值来改变数组的大小
如果将数组的大小设置为变量,则更改变量时不将更改数组的大小。您有两个选择:复制数组的内容,重新分配数组,然后移回内容,或者您可以创建一个具有新大小的新数组并复制元素。
我将展示第二种方式。请注意,这是伪代码,这意味着它不应该直接使用。该数组的类型为“int”。您必须自己实现此代码。
// This function resizes an int array 'array'
// of size 'size' to the size of 'newSize'
void resize(int size, int newSize, int* array)
{
// The array of the new size
int* newArray = new int[newSize];
// 'memcpy' copies over the elements of one array to another.
// The first argument is the array to copy to.
// The second argument is the array to copy from.
// The third argument is the size of the array in the second argument.
memcpy(newArray, array, size * sizeof(int));
// Deallocates the old array so we can safely make it point to the new array.
delete[] array;
// Since the old array is deallocated, we can make it point to the address of
// the new array without it becoming a memory leak.
array = newArray;
// The original array's size has now been changed, and you can
// safely change it's values normally after it's been resized.
}
请记住阅读本文并理解它。如果您无法理解这一点,那么我建议您阅读有关指针和动态数组的更多信息。一旦理解,重写它以满足您的需求。
我还强烈建议为动态数组创建一个模板化的类。它只会使它更加方便,它应该避免由于异常导致的任何内存泄漏。 如果您现在还不知道我在说什么,我建议您阅读更多有关模板的内容。
(顺便说一句,我不能保证100%确定这会起作用。我没有时间测试它)