Mehrere Leerzeichen aus char-array entfernen.



  • Guten Morgen!

    Ich ackere mich momentan durch Ulrich Kaisers C/C++-Buch und seine Aufgaben.
    Nun möchte ich nicht immer im Lösungsteil spicken, sondern die Lösungen eigenständig (oder zumindest mit ein bisschen Hilfestellung) erarbeiten 😉

    Aufgabenstellung ist.
    A6.8: Schreiben Sie ein Programm, das aus einem Text alle mehrfach vorkommenden Leerzeichen entfernt:
    Eingabe: Grundlagen der Informatik
    Ausgabe: Grundlagen der Informatik

    Mein Ansatz war nun folgender:

    char eingabe[80];
    	char ausgabe[80];
    	int i, j;
    
    	printf("Eingabe: ");
    	gets(eingabe);
    
    	for(i = 0, j = 0; ; i++, j++)
    	{
    		if(eingabe[i] == ' ' && eingabe[i+1] == ' ') // wenn das aktuelle und das nächste Zeichen ein Space ist, weitergehen
    			i++;
    		else
    			ausgabe[j] = eingabe[i];
    		if(eingabe[i] == 0) // Bei Stringende den neuen String Nullterminieren
    		{
    			ausgabe[j] = 0;
    			break;
    		}
    	}
    
    	printf("Ausgabe: %s", ausgabe);
    

    Leider entdecke ich sogar nach schrittchenweisem debuggen den Fehler nicht.
    Der Code funktioniert für doppelte Leerzeichen, aber nicht für welche die 3- oder mehr-mal hintereinander vorkommen.
    Vielleicht hat ja auch jemand einen Denkanstoss wie ich mir mein "Hilfsarray" (ausgabe[]) sparen kann.

    Ike



  • Das j++ aus dem Schleifenkopf raus und dann so:

    ausgabe[j++] = eingabe[i];
    

    😉



  • char eingabe[80]; 
        char ausgabe[80]; 
        int i, j; 
    
        printf("Eingabe: "); 
        gets(eingabe); 
    
        for(i = 0, j = 0; ; i++) 
        { 
            if(eingabe[i] == ' ' && eingabe[i+1] == ' ') // wenn das aktuelle und das nächste Zeichen ein Space ist, weitergehen 
                continue; 
            else 
                ausgabe[j++] = eingabe[i]; 
            if(eingabe[i] == 0) // Bei Stringende den neuen String Nullterminieren 
            { 
                ausgabe[j] = 0; 
                break; 
            } 
        } 
    
        printf("Ausgabe: %s", ausgabe);
    


  • Ike schrieb:

    Vielleicht hat ja auch jemand einen Denkanstoss wie ich mir mein "Hilfsarray" (ausgabe[]) sparen kann.

    probier dies:

    void remove_multiple_spaces (char *in)
    {
       char *out = in;
       int sp = 0;
    
       while (*in)
       {
          if (isspace (*in))
             sp++;
          else if (sp) 
          {
             out = out + 1 - sp;
             sp = 0;
          }
          *out++ = *in++;
       }
       *out = 0;
    }
    

    🙂



  • ohaoha schrieb:

    Das j++ aus dem Schleifenkopf raus und dann so:

    ausgabe[j++] = eingabe[i];
    

    😉

    ähm... nein 😉
    jetzt behandelt er zwar den fall von "mehr als 2 leerzeichen" korrekt, aber 2 leerzeichen werden nun zu GARKEINEM leerzeichen.



  • Moin Jungs und Mädels, ist grade nix los...mal n büschen proggen.

    Vielleicht hat ja auch jemand einen Denkanstoss wie ich mir mein "Hilfsarray" (ausgabe[]) sparen kann.

    #include <string.h>
    
    int main()
    {
    	int i = 0, j = 0;
    	char str[] = "Wo  sind      die                    vielen  "
    						"   unnuetzen           Leerzeichen     geblieben ?";
    
    	while( str[i] )
    	{
    		while( str[i] == ' ' && str[i+1] == ' ' ) i++;
    		memmove ( str + j, str + i, 1 );
    		j++; i++;
    	}
    	while ( j < i ) str[j++] = '\0';
    
    	puts(str);
    }
    

    Wünsche noch nen sonnigen Tag 🕶



  • proggingmania schrieb:

    Moin Jungs und Mädels, ist grade nix los...mal n büschen proggen.

    memmove für 1 zeichen zu nehmen ist ja sowas von uncool 😉
    ...und wieso haust du am schluss die ganzen nullen rein?
    🙂



  • pale dog schrieb:

    memmove für 1 zeichen zu nehmen ist ja sowas von uncool 😉

    Wenn ich cool sein will, leg ich mich ins Gefrierfach. 😃
    Memmove achtet auch sich überlappende Bereiche im Speicher.

    pale dog schrieb:

    ...und wieso haust du am schluss die ganzen nullen rein?
    🙂

    Um die restliche Grütze, die überbleibt, unsichtbar zu machen. Ok eine Null reicht.

    🙂



  • proggingmania schrieb:

    Memmove achtet auch sich überlappende Bereiche im Speicher.

    das ist bei nur einem zeichen natürlich ganz besonders wichtig 😉
    mach mal aus der memmove-zeile: str[j] = str[i];
    ich wette das geht auch...

    🙂



  • das ist bei nur einem zeichen natürlich ganz besonders wichtig

    Ok, das war wohl Stuss von mir.

    mach mal aus der memmove-zeile: str[j] = str[i];

    Ja, das geht auch. 🙂



  • #include <stdio.h>
    
    // Improved edition.
    int main() 
    {
    	int i = 0, j = 0;
        char str[] = "Wo  sind      die                    vielen  "
                            "   unnuetzen           Leerzeichen     geblieben ?";
    
        while( str[i] )
        {
            while( str[i] == ' ' && str[i+1] == ' ' ) i++;
            str[j++] = str[i++];
        }
        if ( j < i ) str[j] = '\0';
    
        puts(str); 
    
    	return 1;
    }
    


  • proggingmania schrieb:

    ...
        if ( j < i ) str[j] = '\0';
    ...
    

    das 'if ( j < i )' kannste auch noch weglassen 😉



  • das 'if ( j < i )' kannste auch noch weglassen 😉

    Nee, sonst wird der ganze Müll der noch dranhängt mit ausgegeben.



  • proggingmania schrieb:

    das 'if ( j < i )' kannste auch noch weglassen 😉

    Nee, sonst wird der ganze Müll der noch dranhängt mit ausgegeben.

    nur das if(...) soll weg, das str[j] = '\0'; natürlich nicht.
    🙂



  • Kurze Zwischenfrage: ist

    str[i] = '\0';
    

    identisch mit

    str[i] = 0;
    

    ?



  • Ike schrieb:

    Kurze Zwischenfrage: ist

    str[i] = '\0';
    

    identisch mit

    str[i] = 0;
    

    ?

    JA


Anmelden zum Antworten