使用字符串的 c++ 动态数组不接受字符串
c++ Dynamic array using strings won't accept strings
我正试图将临时数组中的字符串放入动态数组中。但编译器在遇到这种情况时就会崩溃。
其中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
;效率高一点 - 现在使用var
tmp
从临时数组复制到动态数组,代码的结构也有所不同,表明您正在使用它在两个数组之间交换字符串(您不是)-重命名tmp变量或完全删除它
相关文章:
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组