Как хранить входные данные в массиве Dynami c? - PullRequest
0 голосов
/ 05 марта 2020

Итак, я пытаюсь создать программу, которая сохраняет пользовательский ввод в динамический массив c, но я не могу сделать это правильно. Когда я пытаюсь ввести число, скажем, 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;
    }

Ответы [ 2 ]

1 голос
/ 05 марта 2020

У меня две основные проблемы с вашим кодом:

  1. В этом случае нет необходимости в динамическом выделении c, поскольку size является постоянным значением (и может определяется как constexpr, что лучше).
  2. вместо использования стандартных контейнеров (таких как std :: array (для массива постоянного размера) или std :: vector (для динамически расширяемого массива)) вы используете plain массив указателей, что не рекомендуется, и в этом случае может вызвать утечку памяти (например, если вы переместите этот код в служебную функцию, так как вы никогда не удаляете память массива num!), вместо этого вы должны использовать std :: unique_ptr! (и лучше прочитайте о RAII идиома ).
  3. Интервалы и отступы - ваш код должен быть читаем для других кодеров.

О вашем коде, исходный код имеет следующую строку:

cin >> *num

, что означает, что значение в stdin должно быть в ПЕРВОЙ позиции num. В обоих C / C ++ массивы - это просто указатели на первый адрес памяти , выделенный для массива . Чтобы получить доступ к другим элементам, вам нужно использовать оператор [] или указатель arithmeti c с оператором * (например:

cin >> *(num + count)

получит элемент в позиции count ). Кроме того, как указано выше, нет мер безопасности, запрещающих запись в недействительную память, на которую вы можете рассчитывать. Поэтому вы должны использовать контейнеры std, обеспечивающие безопасность индекса.

Просто для справки, вот код I , который был бы написан для получения той же функциональности:

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;
}
0 голосов
/ 05 марта 2020

Так что я немного изменил код. Мой код действителен по какой-то причине? потому что сейчас работает нормально. Я могу ввести числа, и когда я просматриваю все числа, все работает нормально.

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

                cout<<"INPUT HISTORY: \n";
                for(int i=0;i<=count-1;i++){
                    cout<<num[i]<<endl;
                }
                count++;
        }
    }
    return 0;
}
...