2016-04-26 7 views
0

Ich habe vor kurzem an einem Programm gearbeitet, das Namen als Eingaben nimmt und schließlich sortieren & binäre Suche sie. Bei dem Versuch, das Array zu einer dynamischen Größe zu machen (die sich bei jeder Schleifeniteration um eins erhöhen würde), kam es jedoch zu verschiedenen Problemen.Dynamische Array-Größe und Absturz bei getline();

Ich kann das String-Array aus 20 Elementen bestehen und das Programm funktioniert, aber das zusätzliche Guthaben für meine Aufgabe ist es, eine dynamische Größe zu machen. Derzeit stürzt das Programm ohne irgendeine Art von Fehlercode ab, sobald es "getline (cin, Names [x])" erreicht. Ich habe herumgesucht und ich weiß, dass es in diesem Fall leichter wäre, einen Vektor anstelle eines Arrays zu erstellen, aber ich glaube nicht, dass ich Vektoren für diese Aufgabe verwenden darf.

Dank

Originalcode

using namespace std; 
#include <iostream> 
#include <string> 

void main() 
{ 
    int x = 0; 
    string * Names = new string[x]; 
    bool NameInputEnd(0); 

    cout << " Enter your names to be sorted\n"; 
    cout << "To exit just press [Enter] at any time\n"; 

    do 
    { 
     cout << x << endl; 
     cout << "\n< Name " << (x + 1) << " > = "; 

     !!**CRASHES HERE**!! 

     getline(cin, Names[x]); 

     if (Names[x].empty() || x == 19) 
     { 
      cout << "\nFinal Name Amount = " << (x + 1) << endl << endl; 
      NameInputEnd = 1; 
      continue; 
     } 

     x++; 

    } while (NameInputEnd == 0); 

    delete [] Names; 
} 

Änderungen

int tempsize(1), x(0); 
string * Names = new string[tempsize]; 
... 

do 
{ 
... 
    x++; 
    tempsize++; 
}while (NameInputEnd == 0); 
+0

Überlegen Sie, was der Wert von 'X' ist, wenn Sie 'Zeichenfolge verwenden * Namen = new String [x];' . Wie viele Elemente hast du gerade gemacht (Wert von 'x')? Außerdem schlage ich vor, dass Sie einen 'std :: vector' verwenden. – NathanOliver

+0

Oh, ich verstehe jetzt, dass ich das Array auf eine Größe von 0 Elementen eingestellt habe, was von dem, was ich gesehen habe, ungültig ist. Ich habe jetzt eine temporäre Variable erstellt, um in 1 zu ersetzen, das gleichzeitig mit x in jeder Schleifeniteration um 1 wächst. –

+1

Arrays können nicht wachsen, sobald sie erstellt wurden. Das Inkrementieren von "x" erhöht die Größe des Arrays nicht magisch. Sie sollten entweder zuerst genügend Platz reservieren ('string * Names = new string [20];') oder verwenden Sie 'std :: vector' - welches in der Größe anwachsen kann. –

Antwort

1

Ein Array kann nicht geändert werden, sobald sie erstellt wurde. Sie müssen es zerstören und ein neues Array mit einer Kopie der vorhandenen Daten erstellen. Zum Beispiel:

#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

void main() 
{ 
    int x = 0; 
    int capacity = 20; 
    string * Names = new string[capacity]; 
    string Name; 

    cout << " Enter your names to be sorted\n"; 
    cout << "To exit just press [Enter] at any time\n"; 

    do 
    { 
     cout << x << endl; 
     cout << "\n< Name " << (x + 1) << " > = "; 

     if ((!getline(cin, Name)) || Name.empty()) 
      break; 

     if (x == capacity) 
     { 
      int newCapacity = capacity + 20; 
      string *newNames = new string[newCapacity]; 
      copy(Names, Names + x, newNames); 
      delete [] Names; 
      Names = newNames; 
      capacity = newCapacity; 
     } 

     Names[x] = Name; 
     ++x;  
    } 
    while (true); 

    cout << "\nFinal Name Amount = " << x << endl << endl; 

    delete [] Names; 
} 

Sie sollten wirklich einen std::vector, verwenden aber:

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

void main() 
{ 
    vector<string> Names; 
    string Name; 

    Names.reserve(20); // optional 

    cout << " Enter your names to be sorted\n"; 
    cout << "To exit just press [Enter] at any time\n"; 

    do 
    { 
     cout << Names.size() << endl; 
     cout << "\n< Name " << (Names.size() + 1) << " > = "; 

     if ((!getline(cin, Name)) || Name.empty()) 
      break; 

     Names.push_back(Name); 
    } 
    while (true); 

    cout << "\nFinal Name Amount = " << Names.size() << endl << endl; 
} 
+0

Das reparierte es nicht nur, aber auch half mir wirklich, verschiedene syntheseweise mehr zu verstehen. Es gibt wirklich viele Fehler, die ich in meiner Programmierung mache, ich muss viel nachdenken. Danke Herr Lebeau –