从用户输入中删除数组

时间:2018-09-12 08:14:59

标签: c++ arrays loops dynamic

我一般不熟悉C ++和编程,并且为课程安排了小组作业。我们都在不同的部分上工作,我必须将程序的“删除”部分。我必须删除用户询问的特定变量(如果它在数组中),而不是将数组向右移动。完成所需的操作后,会将数组“缩小”一半。

我认为我可以轻松进行收缩,但是我的代码遇到了奇怪的问题,给了我看起来很奇怪的内存地址。

这是我的代码的一部分:)

else if (option == 'd') {
        cout << "Delete element:" << endl; //Ask user which array position to delete//
        for (int i = 0; i < count; ++i) {

            cout << arr[i]; //print out which array index we have///
            cout << endl;
            int pos; //starts new variable for position///
            cin >> pos;
            if (pos >= 1 && pos <= size) //As long as position is greater than 1 and less than size it loops//
            {
                for (i = pos; i <= size; i++)
                {
                    arr[i - 1] = arr[i];
                }
                arr[size] = 0;
                cout << "Elements now:" << endl;
                for
                    (i = 0; i <= size; i++)
                    cout << arr[i] << endl;
            }
            else
                cout << "Element doesn't exist" << endl; //Tells user it doesn't exist if the position doesn't exist//

因此,如果我添加诸如2之类的元素,则表明2在数组中。我在输入中输入2,它给了我

Elements now: 2 -33686019 0

很抱歉,这令人困惑!我正在努力学习自己。谢谢您的耐心等待!

3 个答案:

答案 0 :(得分:0)

该问题似乎是由于数组索引混乱引起的。在C ++数组中,数组从0开始,因此大小为n的数组的有效索引为0,1,...,n-1。这样做有充分的理由,一旦您成为有经验的程序员,它就成为了第二天性,但令人讨厌的是,用户坚持从1开始计数,因此对于用户而言,大小为n的数组的有效索引为1,2,...,n。

避免混淆的最佳方法是在输入时(或在输出之前)立即将用户索引转换为C ++索引。这样一来,您的大多数代码都使用C ++索引方案(由于它是C ++程序,因此非常合理)。

将其应用于您上面的代码

int pos;
cin >> pos;
--pos; // convert from user indexes to C++ indexes
if (pos >= 0 && pos < size) // C++ indexes
{
    for (i = pos + 1; i < size; i++) // C++ indexes
    {
        arr[i - 1] = arr[i];
    }
    --size; // array is now smaller
    cout << "Elements now:" << endl;
    for (i = 0; i < size; i++) // C++ indexes
        cout << arr[i] << endl;
}
else
    cout << "Element doesn't exist" << endl;

我在您的代码中感到困惑的是count变量。我不知道那是什么,您的使用方式对我来说毫无意义,所以我已经忽略了它,但是您可能不应该。

答案 1 :(得分:0)

假设:

  1. arr是固定大小的数组。
  2. size实际上是一个变量,用于存储数组中当前“使用”的元素的数量。
  3. 您的输入策略接受以1开头的索引,因此arr[0]对应于输入pos = 1

这部分有一些问题:

            for (i = pos; i <= size; i++)
            {
                arr[i - 1] = arr[i];
            }
            arr[size] = 0;

首先,如果size等于数组的大小,则会得到未定义的行为,因为arr [size] 不存在。那就是您获得奇怪值的地方,它们是尝试在数组范围之外读取的结果。这是不确定的行为。

第二个在数组移位后,如果不想打印“未使用”的元素,则必须减小大小。

for (int i = pos-1; ++i < size;  ) 
// array should stop when i < size, but increment happens at beginning of loop. 
{
     arr[i-1] = arr[i];
}
arr[size-1] = 0;  // set last element to zero
size--;           

答案 2 :(得分:0)

您缺少arr声明