2016-04-17 8 views
-2

Ich versuche, ein C++ - Programm zum Lesen von Eingaben aus einer Datei, Leerzeichen vor Trennzeichen und Schreiben in eine andere Datei. Beispiel: Eingang: int main() Ausgang: int main()Segmantation Fehler in C++, keine Ausgabe

#include <iostream> 
#include <cstdlib> 
#include <fstream> 
using namespace std; 

fstream oup, inp; 
int dsize = 18; 
char delim[] = {',', ' ', '\n', '\t', '\"', '(', ')', '{', '}', 
       '\'', '[', ']', '+', '-', '*', '&', '/', '%'}; 

bool isDelim(char c) { 
    for (int i = 0; i < 18; i++) 
    if (c == delim[i]) 
     return true; 
    return false; 
} 

void chartost(string a) { 
    int d = 0; 
    if (a.length() == 1) 
    oup << a << " "; 
    else { 
    for (unsigned i = 0; i < a.length(); i++) { 
     if (isDelim(a[i])) { 
     d = 1; 
     oup << a.substr(0, i) << " "; 
     chartost(a.substr(i, a.length())); 
     } 
    } 
    if (d == 0) { 
     oup << a << " "; 
    } 
    } 
} 

int main() { 
    cout << "Initial Point"; 
    inp.open("test.c", ios::in); 
    oup.open("testspace.c", ios::out); 
    string a; 
    cout << "before isopen"; 
    if (inp.is_open() && oup.is_open()) { 
    while (inp >> a) { 
     cout << a; 
     chartost(a); 
    } 
    cout << "after operations \n"; 
    inp.close(); 
    oup.close(); 
    } 
    return 0; 
} 

debuggen ich cout an vielen Orten verwendet haben. Ich bekomme dafür einen Segmentierungsfehler und selbst der cout am Einstiegspunkt von main wird nicht angezeigt.

+3

Versuchen Sie, in einem Debugger auszuführen, um den Absturz in Aktion zu erfassen. Dadurch können Sie feststellen, wo in Ihrem Code der Absturz auftritt, und Sie können auch die Werte der beteiligten Variablen untersuchen. –

+3

Um auch zu garantieren, dass "cout" -Anweisungen angezeigt werden, fügen Sie eine "endl" -Anweisung nach der Ausgabe ein. –

+0

Codeblocks -warning: GDB: Kontrollterminal konnte nicht gesetzt werden: Operation nicht erlaubt –

Antwort

1

Der Code ist ein Chaos, das es sehr schwer macht, Fehler zu erkennen, aber ich stelle fest, dass Ihre Chartost-Funktion rekursiv ist, aber nicht beendet, wenn die Rekursion beendet wird. Die for-Schleife für den ersten Aufruf wird den Rest der Zeichenfolge nach den Code für den Rest der Zeichenfolge rekursiv verarbeitet. Ich würde anfangen, dort nach deinem Problem zu suchen.

+0

danke..Ich werde anfangen, es zu untersuchen –

+0

Das Problem war in der Konstruktion der Teilzeichenfolge, die Länge der Teilzeichenfolge war falsch und daher versuchte das Programm, eine Zeichenfolge der Länge 0 zu konstruieren. Vielen Dank für Ihre Hilfe. –

+0

möchten Sie wahrscheinlich die Schleife nach dem Rekursionsaufruf sowieso beenden (oder entfernen Sie die Rekursion und verwenden Sie stattdessen die Schleife) ... aber ich bin froh, dass Sie das unmittelbare Problem gefunden haben! – PeteB