Frage

Ich bin ein Programm zu schreiben, die Linien von einem infile lesen getline in Strings verwenden, wandeln die Saiten c-strings die ersten m Nicht-Whitespace-Zeichen der Zeichenfolge enthält, verketten dann die C-Strings in einem einzigen char-Array.

Eine Beispieldatei könnte wie folgt aussehen:

5    //number of rows and columns in a grid
2    //number of grids
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

Also würde ich mit einem char-Array von 2x5x5 Zeichen enden. Das Problem ist jetzt mein Code gut auf kleineren Testfällen wie das funktioniert oben gezeigt, aber Segmentierung Fehler, wenn ich versuche, es auf größeres Grids (das heißt 100x100x100).

#include <iostream>
#include <string>
using namespace std;
int main(){
  int mapsize,levels;
  cin>>mapsize;
  cin>>levels;
  char map[mapsize*mapsize*levels];
  string input;
  for (int i=0;i<levels;i++){
    for (int j=0;j<mapsize;j++){
      getline(cin,input);
      char *row;
      row=new char[input.size()+1];
      strcpy(row, input.c_str());
      for (int k=0;k<mapsize;k++){
        map[i*mapsize*mapsize+j*mapsize+k]=row[k];
      }
      delete [] row;
    }
  }
return 0;
}

würde ich dieses Programm mit einem infile nennen: ./program

Ich habe es laufen gdb und tat Backtrace. Es ist immer Punkte auf der Linie „String-Eingang;“

Irgendwelche Ideen, wie ich dieses segfault lösen können? Dank

War es hilfreich?

Lösung

map ist ein VLA, auf dem Stapel reserviert, also denke ich, würde, dass Ihr Problem ist, dass Sie einen Stapelüberlauf zu bekommen. GDB weist einen den Bau von input denn das ist die erste Sache, die auf diesem übergelaufen Stapel aufgebaut wird.

Andere Tipps

Ich bin nicht sicher, warum der Backtrace zu string input; zeigt aber, wenn Sie row in map Kopieren werden. wenn Kartengröße größer als die Größe der Reihe ist, könnten Sie auch am Ende seg-Verwerfungen. Dies wird häufiger für eine größere Kartengröße.

Sie können auch mehr als Absenderadressen auf dem Stapel werden Stampfen, dass der „falschen“ core-Dump verursacht werden könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top