Leerschritte entfernen, Schleife stoppt nicht

Jiekas

Mitglied
Leerschritte entfernen, Speicherzugriffsverletzung

Hallo!

Ich benutze Dev-C++ 4.9.9.2 und hab ein Problem.

Ich möchte bei einem String (text) alle Leerzeichen am Anfang entfernen udn habe mir foglende Funktion ausgedacht:

Code:
//Funktion, um Leerschritte am Anfang der Zeile zu entfernen
int stripspaces(char text[1024])
{
    int n=0;
    do {
        do {
            text[n] = text[n++];
        } while (text[n++] != '\0');
    } while (text[0] == ' ');
}

Mal eben der Aufbau, wie ich mir das gedacht hab:

Wenn das erste Zeichen des String ein Leerschritt ist, dann laufe eine Schleife durch, die jedes Zeichen n durch das nächste Zeichen von n ausgegangen (n++) ersetzt.

Allerdings funktioniert dies so nicht, ich bekomme einen Fehler und das Programm wird beendet.

Woran kann das liegen? Was hab ich bei der o.g. Funktion falsch gemacht? Gibt es vielleicht Vorschläge, wie das einfacher / schneller usw geht?


MfG

Stephan
 
Zuletzt bearbeitet:
moin


So z.B.
Code:
     char text[1024])
     char dummy[1024];
     char temp;
     int i=0, x=0;

     while(text[i++] == ' ' );
     while( text[i] != '\0' )
          dummy[x++] = text[i++];

Nun ist der bereinigte String in dummy.
Nicht getestet.


mfg
umbrasaxum

mfg
umbrasaxum
 
Re: Leerschritte entfernen, Speicherzugriffsverletzung

Da sind gleich mehrere Fehler drin.
Erstens inkrementierst du n 2 mal: einmal in der Schleife (text[n] = text[n++];) und dann noch in der Bedingung. Aber ich nehme an, n soll pro Durchlauf nur um 1 erhöht werden.
Zweitens...
..ach das, was du da machst, versteh ich kein bisschen, für mich ergibt das irgendwie keinen Sinn... hier so würde ichs machen:
Code:
int stripspaces(char text[]){
    int n=0,i=0;
    while(text[n]==' ')
        ++n;
    do{
        text[i] = text[i+n];
    }while(text[i++ + n]);
}

oder besser noch, du arbeitest mit Strings

Code:
void stripspaces(string& str){
   str.erase(0,str.find_first_not_of(' ')); }
 
Du hast n an der falschen Stelle erhöht und zudem noch n++ falsch erhöht (n++ wird erst beim nächsten n erhöht, deswegen wird text[n] == text[n++] immer das gleiche zugewiesen).
Und du hast n vergessen auf 0 zurückszusetzen. Hier ist der Code(! du musst aber noch das '\0' im text string nach den Schleifen noch selbst setzen (etwas musst du auch selber tun).

Code:
do {
		n = 0;
		
		do {
			text[n] = text[n+1];
			n++;
		} while (text[n+1] != '\0');
	} while (text[0] == ' ');
 
Ups, war wohl ein bisschen zu spät mit meinem code, deshalb hab ich die anderen Beiträge nicht mehr gesehen. Tschuldigung
 
moin


Kein Ding!
Wir haben schliesslich alle mal angefangen.

Aber mal eben was anderes:
Könnte mir einer sagen wozu man do-while Schleifen braucht bzw. warum man sie benutzen sollte?
Ich programmiere seit fast 6 Jahren und hab noch nie eine benutzt.


mfg
umbrasaxum
 
Jaa :)
Ich programmier jetz 2 oder 3 Jahre und hab eigentlich nie eine benutzt, bis vor 4 Tagen!
Dann is mir aufgefallen, dass es manchmal geschickt ist...
 
Hallo!

Ich wollte das ganze jetzt mit Strings lösen, aber ich verzweifle langsam an den sch...önen Strings.

Ich lese aus einer Text-Datei die einzelnen Zeilen in die Variable "ZEILE" mit dem Typ "char". Diese Zeile will ich jetzt an die Funktion (s.u.) übergeben.

Code:
int stripsps(string& text) {
    text.erase(0,text.find_first_not_of(' ')); 
}

Aber das klappt (natürlich) nicht. Ich hatte versucht, den Inhalt der ZEILE-variable mit "strcpy" in den String zu kopieren, aber auch da gibt's nen Fehler.

Was muss ich denn machen, damit ich den Typ sozusagen umändern kann?
 
hai.. war ne lange Zeit nicht mehr da..
..falls es dich noch interessiert:
Code:
char zeile[5000];
//einlesen in zeile
string s = zeile;
strips(s);
alternativ kannst du mit der funktion getline auch gleich in einen String einlesen, falls du eine der Streamklassen für die Eingabe verwendest:
Code:
string s;
getline(instream,s);
strips(s);
 
Zurück