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

时间:2014-02-13 08:43:06

标签: c++ arrays pointers

我试图将字符串放入一个临时数组中,放入动态数组中。但是编译器在遇到它时就会中断。

调用dynaicArray:

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:我知道矢量更好。不幸的是,他们不是一个选择。

1 个答案:

答案 0 :(得分:1)

一些设计理念:

  • if (decide == 'N')块中的代码在while之后更好地放置,以使while更小==更具可读性
  • 完成上述操作后,您可以直接使用moreStrings的结果设置decide == 'N' var;不再需要明确的if
  • 你现在在每次传递中都做dynamicArray = new string[size];,这是一个巨大的内存泄漏(你用新副本覆盖新创建的动态数组而不首先回收旧的 - 见dalete [ ])
  • 如前所述:不要假设100就足够了 - 读取“缓冲区溢出”(只有可行的解决方案:将其设置为动态数组,如果它已满,则将其重新分配给更大的数组)
  • 在使用之前更好地初始化函数中的size - 更安全;来电者不需要记得自己动手
  • C ++数组是基于0的,所以当你开始复制它们时,你最好从0开始而不是1
  • nitpick:for (int i = 1; i <= (size); i++):围绕大小的()是多余的
  • 奖励高级挑剔:在这些情境中使用++size++i;它的效率更高
  • 你现在使用var tmp从temp数组复制到动态数组,代码也有点结构化,建议你用它来交换两个数组之间的字符串(你不是) - 重命名tmp变量或完全删除它