Die Anzahl der Zeilen und Spalten dieses Arrays wird vom Benutzer angegeben, die Anzahl der Zeilen ist jedoch nicht gleich (das Array ist ungleichmäßig), und der Benutzer füllt das Array durch Eingabe der Elemente.

Dies ist der Code, den ich geschrieben habe, aber wenn ich versuche, Eingaben vom Benutzer zu übernehmen, stürzt der Code nach einigen Eingaben ab. Könnten Sie mir bitte helfen und meinen Code korrigieren und auf meine Fehler hinweisen? Dankeschön.

#include <iostream>
//2d array
using namespace std;

int main()
{
    int row;
    int col_x;
    cout << "Enter the row number:" << endl;
    cin >> row;
    //cout<<"Enter the column number:"<<endl;
    //cin>>col;
    int **a = new int *[row];
    for (int r = 0; r < row; r++)
    {
        cout << "Enter the column no.of array " << r << endl;
        cin >> col_x;
        a[r] = new int[col_x];

        cout << "Enter the elements in the array:" << endl;
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col_x; j++)
            {
                cin >> a[i][j];
            }
        }
        cout << "The elements in the array:" << endl;
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col_x; j++)
            {
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
    }

    delete[] a;
    a = NULL;

    return 0;
}
3
Shaan 7 Feb. 2020 im 16:19

4 Antworten

Beste Antwort

Es gab eine zusätzliche for-Schleife. Außerdem müssen Sie die Größe jeder Zeile speichern. Und machen Sie die richtige Freigabe des 2D-Arrays.

#include <iostream>
//2d array
using namespace std;

int main()
{
    int row;
    cout<<"Enter the row number:"<<endl;
    cin>>row;
    int **a=new int *[row];
    int *col_x = new int [row];

    for(int r=0;r<row;r++){
        cout<<"Enter the column no.of array "<<r<<endl;
        cin>>col_x[r];
        a[r]=new int[col_x[r]];

        cout<<"Enter the elements in the array:"<<endl;

        for(int j=0;j<col_x[r];j++){
            cin>>a[r][j];
        }
    }

    cout<<"The elements in the array:"<<endl;
     for(int i=0;i<row;i++){
        for(int j=0;j<col_x[i];j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

    for (int i=0; i<row; ++i)
        delete[] a[i];
    delete []a;
    delete []col_x;
    return 0;
}

3
André Caceres 7 Feb. 2020 im 13:37

Die Art und Weise, wie Sie die Eingaben vom Benutzer erhalten, ist sehr vage und neigt dazu, auf ungültigen Speicher zuzugreifen. Sie erhalten dieselbe Zeile viele Male in der inneren Schleife. Versuchen Sie so etwas:

#include <iostream>
 //2d array
using namespace std;

int main() {
  int row;
  int col_x;
  cout << "Enter the row number:" << endl;
  cin >> row;
  //cout<<"Enter the column number:"<<endl;
  //cin>>col;
  int ** a = new int * [row];
  for (int r = 0; r < row; r++) {
    cout << "Enter the column no.of array " << r << endl;
    cin >> col_x;
    a[r] = new int[col_x];

    cout << "Enter the elements in the array:" << endl;
    for (int j = 0; j < col_x; j++) {
      cin >> a[r][j];
    }
  }
  cout << "The elements in the array:" << endl;
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col_x; j++) {
      cout << a[i][j] << " ";
    }
    cout << endl;
  }
  delete[] a;
  a = NULL;
  return 0;
}

Beachten Sie außerdem, dass col_x nur die Größe der letzten Zeile enthält. Es funktioniert also nicht für den Druck am Ende des Codes.

2
Mohammed Deifallah 7 Feb. 2020 im 13:38

Sie sind sich nicht sicher, was Sie erreichen möchten, aber das Hauptproblem mit dem obigen Code ist, dass Sie auf nicht vorhandene Elemente Ihres Arrays zugreifen. Vielleicht sollte Ihre Schleife über r in Zeile 18 enden? Selbst dann müssten Sie die Anzahl der Spalten pro Zeile in einer externen Variablen speichern. Ich würde vorschlagen, anstelle fester Arrays ein std::vector als Container zu verwenden, in Ihrem Fall ein std::vector< std::vector<int> >. Die Vektorklasse verfügt über eine Methode size(), die ihre tatsächliche Größe speichert.

2
André 7 Feb. 2020 im 13:39

Da Sie C ++ verwenden, sollten Sie die Container nutzen, die zum Speichern Ihrer Daten bereitgestellt werden. In diesem Fall wäre ein Vektorvektor geeignet:

Live-Probe

#include <iostream>
#include <vector>

using namespace std; //<-- for test, souldn't be used

int main() {

    int rows, cols, temp;
    vector<vector<int>> matrix;

    cout << "Enter the row number:" << endl;
    cin >> rows;

    for (int i = 0; i < rows; i++){
        vector<int> v;
        cout << "Enter the column no.of array " << i << endl;
        cin >> cols;
        cout << "The elements in the array:" << endl;
        for (int j = 0; j < cols; j++){
            cin >> temp;
            v.push_back(temp);
        }
        matrix.push_back(v);
    }
    cout << endl;
    for( auto i: matrix){   //print results
        for(int j: i)
            cout << j << " ";
        cout << endl;
    }
}
2
anastaciu 7 Feb. 2020 im 14:19