2016-04-09 17 views
0

Ich bin neu in C++ zu programmieren und ich versuche zu lernen. Derzeit arbeite ich an einem Programm, das aus einer Datei liest, die in fortlaufenden Zeilen eine Zeichenfolge gefolgt von 3 Ganzzahlen hat.C++ Segmentierung Fehler im Zusammenhang mit Atoi Ausdruck

Beispiel: (Dieser erster Satz von Daten ist, gibt es neun andere im gleichen Format wie unten)

Linus too good 
100 
23 
210 

Die Saiten in einen 1D-Array gespeichert werden, während die ganzen Zahlen in einen 2D-Array gespeichert sind.

Bisher habe ich dies:

#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

void FileToArray(); 

using namespace std; 

int main() 
{ 
    FileToArray(); 

    return 0; 
} 

void FileToArray() 
{ 
    ifstream inFile; 

    inFile.open("bowlers2.txt"); 

    const int STRING_ARRAY_SIZE = 10; 
    const int NUM_ROW_SIZE = 3; 
    const int NUM_COL_SIZE = 10; 

    double scores[NUM_ROW_SIZE][NUM_COL_SIZE]; 
    string names[STRING_ARRAY_SIZE]; 
    string mystring; 

    for(int r = 0; r < 10; r++) 
    { 
     getline(inFile, names[r]); 

     for(int c = 0; c < 3; c++) 
     { 
      getline(inFile, mystring); 
      scores[r][c] = atoi(mystring.c_str()); 
     } 
    } 
    cout << "The names are:\n"; 
    for (int i = 0; i < STRING_ARRAY_SIZE; i++) 
    { 
     cout << names[i] << "\n"; 
     for (i = 0; i < NUM_COL_SIZE; i++) 
     { 
      for (int j = 0; j < NUM_ROW_SIZE; j++) 
      { 
      cout << scores[i][j] << "\n"; 
      } 
     } 
    } 
} 
inFile.close(); 

I isoliert aus, Partituren [r] [c] = atoi (mystring.c_str()); und das Programm läuft, obwohl es Müllwerte gibt. ist hier, dass die Ausgabe:

The names are: 
Linus too good 
0 
2.96439e-323 
6.63467e-315 
6.95306e-310 
6.94939e-310 
1.4822e-323 
2.52023e-320 
6.94939e-310 
6.94939e-310 
6.95306e-310 
6.91692e-323 
7.6287e+228 
6.59695e-310 
6.94939e-310 
6.95306e-310 
6.95306e-310 
7.41098e-323 
3.44197e+175 
1.69599e+161 
5.83684e-310 
6.95306e-310 
6.94939e-310 
0 
6.94939e-310 
0 
0 
0 
0 
1.02437e-316 
4.04739e-320 

Sie für jede Hilfe zu diesem Thema Vielen Dank im Voraus.

+1

Sie deklarierten 'Double Scores [NUM_ROW_SIZE] [NUM_COL_SIZE];' mit 'NUM_ROW_SIZE = 3'. Allerdings geht Ihre Schleife 'für (int r = 0; r <10; r ++)' auf 'r = 10' und Sie greifen auf 'scores [r] [c] 'zu. Das ist schlecht. "r" gültiger Bereich ist 0 bis 2. – lurker

+0

Nur FYI, sowohl die seg Fehler und Müll-Werte sind tatsächlich bezeichnend für genau das gleiche Problem. Sie sind beide mögliche Ergebnisse von "undefiniertem Verhalten". Siehe auch: [Definitive Liste gemeinsamer Gründe für Segmentierungsfehler] (http://stackoverflow.com/questions/33047452/definitive-list-of-common-reasons-for-segmentation-faults) – CodeMouse92

+0

ty für die Referenz. – mrbw

Antwort

0

ich glaube, Sie könnten es zuerst debuggen und dann die Logik etwas aussortieren.

Ein Fehler ist in den verschachtelten Schleifen, wo Sie versuchen, die Ergebnisse auszudrucken, und Sie verwendeten i zweimal in äußeren und inneren Schleifen. (Ich glaube nicht, dass die innere Schleife for (i = 0; i < NUM_COL_SIZE; i++) notwendig ist.)

Ein weiterer Fehler ist, wenn Sie das 2D-Array scores deklarieren. Versuchen double scores[10][3];

Ich habe versucht, den Code w/diese beiden Korrekturen und es funktionierte.

Willkommen bei C++ und Spaß Debugging!

+0

Das hat es behoben. = D Vielen Dank. – mrbw

0

Sie haben Array mit max Zeilen = 3 und Spalten = 10 deklariert, aber Sie greifen umgekehrt zu. So tauschen

scores[r][c] = atoi(mystring.c_str());

mit

scores[c][r] = atoi(mystring.c_str());