使用字符串的 c++ 动态数组不接受字符串

c++ Dynamic array using strings won't accept strings

本文关键字:字符串 数组 不接受 动态 c++      更新时间:2023-10-16

我正试图将临时数组中的字符串放入动态数组中。但编译器在遇到这种情况时就会崩溃。

其中dynicArray被调用:

string* dynamicArray = NULL;

以下是它的崩溃之处:

for (int i = 1; i <= (size); i++)
{
dynamicArray[i] = tempArray[i];
}

填充tempArray的位置:

void populateArray(int& size, string*& dynamicArray)
{
char decide;
string tempArray[100]; //Holds the strings until the size is known
bool moreStrings = true;
while (moreStrings == true)
{
cout << "nEnter your string here:";
cin >> tempArray[size];
cout << "nDo you want to enter another string? Y/N:";
cin >> decide;
decide = toupper(decide);
size ++;
dynamicArray = new string[size];
if (decide == 'N')
{
for (int i = 1; i <= (size); i++) //moves all of the strings from tempArray to dynamicArray
{
string temp;
temp = tempArray[i];
dynamicArray[i] = temp;
}
moreStrings = false;
}
}
}

PS:我知道矢量更好。不幸的是,它们不是一种选择。

一些设计思想:

  • if (decide == 'N')块中的代码最好放在while之后,以使while更小==更可读
  • 一旦实现了以上内容,您就可以使用decide == 'N'的结果直接设置moreStrings变量;不再需要显式if
  • 现在,您在while的每个过程中都要执行dynamicArray = new string[size];,这是一个巨大的内存泄漏(您正在用一个新副本覆盖新创建的动态数组,而没有先回收旧的副本-请参阅dalete[])
  • 如前所述:不要假设100就足够了——读取"缓冲区溢出"(唯一可行的解决方案:将其作为一个动态数组,如果它已满,则将其重新分配给一个更大的数组)
  • 在使用函数之前,最好先在函数中初始化size,这样更安全;打电话的人不需要记住自己动手
  • C++数组是基于0的,所以当您开始复制它们时,最好从0开始,而不是从1开始
  • nitpick:for (int i = 1; i <= (size); i++):周围的()大小是多余的
  • 奖励高级挑剔:在这些上下文中使用++size++i;效率高一点
  • 现在使用vartmp从临时数组复制到动态数组,代码的结构也有所不同,表明您正在使用它在两个数组之间交换字符串(您不是)-重命名tmp变量或完全删除它