【问题标题】:Search in Dynamic Array在动态数组中搜索
【发布时间】:2016-05-01 19:55:58
【问题描述】:

当我在动态数组中搜索整数时,搜索功能无法正常工作,因为它始终显示其位置为 1。无论数据是否实际存在。

我实际上想要做的是使用动态数据结构,我正在添加数据。删除,搜索和保存到txt文件。并将其加载回来。但问题是搜索。我使用了switch case,搜索在Case 4。

#include<iostream>
#include<string>
#include<fstream> //to save file in text

using namespace std;

int main()
{
    int *p1;
    int size = 0;
    int counter = 0;
    p1 = new int[size];


    int userchoice;
    int i;
    int position;


    while (1)
    {
        cout << "Please enter your choice " << endl;
        cout << endl;
        cout << "To insert Press '1'" << endl;
        cout << "To Delete press '2'" << endl;
        cout << "To View press '3'" << endl;
        cout << "To Search press '4'" << endl;
        cout << "To Save Press '5'" << endl;
        cout << "To Load Previously saved Data press '6'" << endl;
        cout << "To Exit press '7'" << endl;
        cout << endl;
        cout << "Enter your choice: ";
        cin >> userchoice;


        switch (userchoice)  // User's selection from the menu
        {
        case 1: //Insert Number
            cout << "Enter a Number:  ";
            cin >> p1[size];
            counter++;
            size++; //Add's memory space
            break;

        case 2: //Delete Number

            int udelete;

            cout << "Enter a number to delete:  ";
            cin >> udelete; //User enters Number to be deleted

                            //Checking if the number is in an array.
            for (position = 0; position<size; position++)
            {
                if (p1[position] == udelete)
                    break;
            }
            if (position>size)
            {
                cout << "The number is not in the memory:  ";
                cout << endl;
                break;
            }
            for (i = position; i<size; i++) {
                p1[i] = p1[i + 1];
            }
            size--;
            cout << "Successfully Deleted!!! ";
            cout << endl;
            break;
        case 3: // View


            for (i = 0; i<size; i++)
            {
                cout << "Your data" << " " << i << " " << "-->" << p1[i] << endl;
            }
            break;

        case 4:
        {
            int usearch;

            cout << "Please enter the figure you would like to search ";
            cout << "->";
            cin >> usearch;

            for (i = 0; i>size; i++)
            {
                if (p1[size] == usearch)
                    break;
            }
            if (usearch == size)
            {
                cout << "not found. ";
            }
            cout << "Position at: " << i + 1 << endl;
            break;

        }



        case 5: // Save

        {
            ofstream save;
            save.open("Dynamicdata.txt", ofstream::out | ofstream::app);

            for (i = 0; i<size; i++)
            {
                save << p1[i] << endl;
            }

            save.close();
            cout << "File Saved " << endl;

            break;
        }

        case 6: //Read from File
        {


            string read;

            ifstream file_("Dynamicdata.txt");

            if (file_.is_open())
            {
                while (getline(file_, read))
                {
                    cout << read << "\n";
                }
                file_.close();
            }
            else
                cout << "File Not open" << endl;
            cin.get();
            break;

        }

        case 7:
        {
            return 0;
        }

        }
    }
}

【问题讨论】:

    标签: c++ arrays list dynamic


    【解决方案1】:

    你的问题是你的数组的大小是0。在这里你将size设置为0,然后size设置为p1的大小

    int size=0;
    int counter=0;
    p1 = new int[size];
    

    您将需要增大大小,以便您可以将元素实际存储在 p1 中,或者使用 std::vector 代替使用数组和动态内存分配并让它为您处理。

    【讨论】:

      【解决方案2】:

      代码具有未定义的行为,因为最初由指针 p1 指向的动态分配的数组没有元素

      int size=0;
      ^^^^^^^^^^
      //...
      p1 = new int[size]; // size is equal to 0
      

      所以在下面的代码中 sn-p 尝试将数据写入p1[size] 会导致未定义的行为

      case 1: //Insert Number
              cout<<"Enter a Number:  ";
              cin>>p1[size]; // undefined behaviour
              ^^^^^^^^^^^^^
              counter++;
              size++; //Add's memory space
              break;
      

      您需要重新分配数组以为添加的新元素保留内存。

      考虑到例如这个循环

              for (i = 0; i>size; i++)
                          ^^^^^^^
              {
                  if (p1[size] == usearch)
                      break;
              }
      

      永远不会迭代,因为变量i 设置为零不能大于size 至少等于零。

      这样写在逻辑上更正确

                  if (p1[i] == usearch)
                      ^^^^^
      

      而不是

                  if (p1[size] == usearch)
                      ^^^^^^^^
      

      因此这个 if 语句

              if (usearch == size)
                  ^^^^^^^
              {
                  cout << "not found. ";
              }
      

      应该用这个for语句替换

              if (i == size)
                  ^^
              {
                  cout << "not found. ";
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-16
        • 2021-04-05
        • 2017-01-03
        • 1970-01-01
        • 2012-03-08
        • 2019-04-02
        相关资源
        最近更新 更多