首页 > 解决方案 > 如何将输入存储在动态数组中?

问题描述

所以我正在尝试制作一个将用户输入存储到动态数组中的程序,但我做错了。当我尝试输入一个数字时,让我们说 1,然后我想再试一次,然后我想查看历史记录,唯一显示的是我输入的最后一个数字。有时像1214098101909279242这样的大量播种。

这是我的代码:

#include<iostream>
    using namespace std;
    int main(){
        const int size = 20;
        int *num = new int[size];
        char answer;
        while(true){
        cout<<"ENTER NUMBER: \n";
        cin>>*num;
        cout<<"TRY AGAIN? ";
        cin>>answer;
            switch(answer){
                case 'y':
                    num[size+1];
                    system("cls");
                    break;
                default:
                    cout<<"INPUT HISTORY: \n";
                    for(int i=0;i<=size;i++){
                        cout<<num[i];
                    }
            }
        }
        return 0;
    }

标签: c++dynamic-arrays

解决方案


我的代码有两个主要问题:

  1. 在这种情况下不需要动态分配,因为size是一个 const 值(并且可以定义为 constexpr,这样更好)。
  2. 而不是使用标准容器(例如 std::array (用于常量大小数组)或 std::vector (用于动态扩展数组)),而是使用普通指针数组,这是不明智的,在这种情况下可能会导致内存泄漏(例如,如果您将此代码移动到实用程序函数中,因为您永远不会删除 num 数组的内存!),您应该使用 std::unique_ptr 代替!(并更好地阅读有关RAII 成语的信息)。
  3. 间距和缩进 - 您的代码也应该对其他编码人员可读。

关于您的代码,原始代码具有以下行:

cin >> *num

这意味着将stdin中的值放入num的FIRST位置。在 C/C++ 中,数组只是指向为数组分配的内存的第一个地址的指针。为了访问其他项目,您需要使用 operator[] 或使用带有 operator* 的指针运算(例如:

cin >> *(num + count)

将在位置count获得项目)。此外,如上所述,没有安全措施来禁止写入您可以依赖的无效内存。因此,您应该使用强制索引安全的标准容器。

仅供参考,这是为获得相同功能而编写的代码:

int main() {
    constexpr size_t SIZE = 20;
    std::array<int, SIZE> arr;
    arr.fill(0);

    int last_filled_position = 0;
    bool cont = true;

    while (cont)
    {
        int val;
        char answer;

        cout << "ENTER NUMBER:" << std::endl;

        cin >> val;

        cout<<"TRY AGAIN? Yes/Print/Stop";

        cin >> answer;

        arr.at(last_filled_position++) = val;

        switch (answer)
        {
            case 'y':
                system("cls");
                break;
            case 'p':
                cout << "INPUT HISTORY: " << std::endl;

                for (int val: arr) // With more complex types, you should use const auto&
                {
                    cout << val << ", ";
                }

                cout << endl;
                break;
            case 's':
                cont = false;
                cout << "STOPPING";
                break;
        }
    }

    return 0;
}

推荐阅读