动态数组大小并在 getline() 处崩溃;

Posted

技术标签:

【中文标题】动态数组大小并在 getline() 处崩溃;【英文标题】:Dynamic Array Size and crashing at getline(); 【发布时间】:2016-04-26 17:55:06 【问题描述】:

我最近一直在开发一个程序,该程序将名称作为输入并最终对它们进行排序和二进制搜索。但是,在尝试使数组成为动态大小(每次循环迭代都会增加一)时,它遇到了各种问题。

我可以制作由 20 个元素组成的字符串数组,并且程序可以运行,但我的任务的额外功劳是使其具有动态大小。目前,程序一旦到达“getline(cin, Names[x]);”就会崩溃,没有任何类型的错误代码。 我一直在四处寻找,我知道在这种情况下使用向量而不是数组会更容易,但是我不相信我可以在这个分配中使用向量。

谢谢

原始代码

using namespace std;
#include <iostream>
#include <string>

void main()

    int x = 0;
    string * Names = new string[x];
    bool NameInputEnd(0);

    cout << "    Enter your names to be sorted\n";
    cout << "To exit just press [Enter] at any time\n";

    do
    
        cout << x << endl;
        cout << "\n< Name " << (x + 1) << " > = ";

        !!**CRASHES HERE**!!

        getline(cin, Names[x]);

        if (Names[x].empty() || x == 19)
        
            cout << "\nFinal Name Amount = " << (x + 1) << endl << endl;
            NameInputEnd = 1;
            continue;
        

        x++;

     while (NameInputEnd == 0);

    delete [] Names;

变化

int tempsize(1), x(0);
string * Names = new string[tempsize];
...

do

...
    x++;
    tempsize++;
while (NameInputEnd == 0);

【问题讨论】:

当你使用string * Names = new string[x];时,想想x的值是多少。您刚刚制作了多少个元素(x 的值)?另外我建议你改用std::vector 哦,我现在明白了,我将数组设置为具有 0 个元素的大小,这从我所看到的搜索中是无效的。我现在创建了一个临时变量来替换,它最初设置为 1,在每次循环迭代中与 x 同时增长 1。 数组一旦创建就不能增长。递增x 不会神奇地增加数组的大小。您应该先分配足够的空间 (string *Names = new string[20];) 或使用 std::vector - 它的大小会增加。 这样有效吗?如果没有,请更新问题和代码。 更新到我所做的更改,它现在在循环的第 4 次迭代中收到错误,我不太明白。那么数组在创建后根本不可能增长?在那种情况下,也许额外的功劳想让我把数组变成向量。在哪种情况下,有人有我可以查看的推荐页面吗?不幸的是,我对向量并不是特别熟悉。 【参考方案1】:

数组一旦创建就不能调整大小。您必须销毁它并使用现有数据的副本创建一个新数组。例如:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

void main()

    int x = 0;
    int capacity = 20;
    string * Names = new string[capacity];
    string Name;

    cout << "    Enter your names to be sorted\n";
    cout << "To exit just press [Enter] at any time\n";

    do
    
        cout << x << endl;
        cout << "\n< Name " << (x + 1) << " > = ";

        if ((!getline(cin, Name)) || Name.empty())
            break;

        if (x == capacity)
        
            int newCapacity = capacity + 20;
            string *newNames = new string[newCapacity];
            copy(Names, Names + x, newNames);
            delete [] Names;
            Names = newNames;
            capacity = newCapacity;
        

        Names[x] = Name;
        ++x;    
    
    while (true);

    cout << "\nFinal Name Amount = " << x << endl << endl;

    delete [] Names;

不过,您确实应该使用std::vector

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void main()

    vector<string> Names;
    string Name;

    Names.reserve(20); // optional

    cout << "    Enter your names to be sorted\n";
    cout << "To exit just press [Enter] at any time\n";

    do
    
        cout << Names.size() << endl;
        cout << "\n< Name " << (Names.size() + 1) << " > = ";

        if ((!getline(cin, Name)) || Name.empty())
            break;

        Names.push_back(Name);
    
    while (true);

    cout << "\nFinal Name Amount = " << Names.size() << endl << endl;

【讨论】:

这不仅修复了它,而且真的帮助我更多地理解了各种语法方式。我在编码中确实犯了很多错误,我有很多需要修改的地方。谢谢勒博先生

以上是关于动态数组大小并在 getline() 处崩溃;的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中动态调整数组的大小

指向动态声明的 cstrings 数组的指针

堆栈动态和堆栈动态数组

二维数组动态内存分配崩溃[重复]

删除动态数组时崩溃

释放动态数组初始化时程序崩溃