调整动态数组大小时保留用户输入的值的问题

Issue with retaining user inputted values when resizing a dynamic array

本文关键字:输入 问题 用户 保留 动态 数组 小时 调整      更新时间:2023-10-16

这是我尝试创建一个动态数组,该数组在用户为数组预分配数据后调整大小。我使用第二个索引/计数器来获取原始计数器的值。

最具体地说,如何将计算机中的随机值替换为用户输入的值?

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
    int size;
    cout <`enter code here`< "Enter the size of the array: ";
    cin  >> size;
    if (size <= 0) {
        cout << "Array size must be > 0" << endl;
        exit(0);
    }
    int *arr;
    arr = new int[size];
    int num = 0;
    int idx = 0, idx2 = 0;
    while (num != -1)
    {
        cout << "Enter a value to place into an array or -1 to exit: ";
        cin >> num;
        if (num == -1)
        {
            break;
        }
        else if (idx < size)
        {
            arr[idx++] = num;
        }
        else
        {
            idx2 = idx * 2;
            int *newArr = new int[size];
            memcpy(newArr, arr, size * sizeof(int));
            delete [] arr;
            newArr[idx++] = num;
            arr = newArr;
            /*
             int* temp = new int[length + added];
             memcpy(temp, array, length * sizeof(int));
             memcpy(temp + length, added_array, added * sizeof(int));
             delete[] array;
             array = temp;
             */
        }
    }
    for(int x = 0; x < idx; x++)
    {
        cout <<arr[x] << endl;
    }
    cout << endl  << "Reshaped Array of Size: "<< idx << endl;
    return 0;
}

具体来说,我输出的大小为 2 的数组错误地显示我输入的值 (2, 3, 4, 5, 6, 66, 55(:

3
4
268848517
6
1397644077
55
Reshaped Array of Size: 6
Program ended with exit code: 0

从你的代码中,

        else
        {
            idx2 = idx * 2;
            int *newArr = new int[size];               <<<<<<<<<<<<  bug
            memcpy(newArr, arr, size * sizeof(int));   <<<<<<<<<<<<
            delete [] arr;
            newArr[idx++] = num;
            arr = newArr;

有一个错误。您正在创建具有相同"大小"的 int[]。它应该是"idx2"。

+ memcpy(( 的复制大小应该相应地改变(例如 idx(

请替换此行

idx2 = idx * 2;

size = size * 2;

不再需要使用 idx2。然后它会起作用。

虽然你最大的问题是idx2 = idx * 2乘而不是size乘以二,但你可能想重新排序你的条件测试以消除三部分测试。您需要做的就是检查是否num == -1,如果是,则break,否则只需文本(如果idx == size(,如果是,则重新分配,例如

    while (num != -1)
    {
        cout << "Enter a value to place into an array or -1 to exit: ";
        cin >> num;
        if (num == -1)
            break;
        else if (idx == size) {
            int *newArr = new int[2 * size];
            memcpy(newArr, arr, size * sizeof(int));
            delete [] arr;
            arr = newArr;
            size *= 2;
        }
        arr[idx++] = num;
    }

(除非break;循环,否则将始终分配arr[idx++] = num; (

不要忘记

释放您分配的内存,例如

    delete [] arr;
    return 0;
}

请注意,您应该始终验证您的输入,例如

    if (!(cin >> num)) {
        cerr << "error: invalid integer value.n";
        break;
    }