Zeichen aus Zeichenkette löschen



  • Hallo, folgendes Problem beschäftigt mich seit geraumer Zeit. Ich möchte / soll aus einer übergebenen Zeichenkette alle Leerzeichen löschen, diese soll mit folgendem Prototype realisiert werden:

    void entferne_Zeichen(char *line);
    

    Jetzt hatte ich folgendes versucht, das klappte aber nicht wirklich:

    void entferne_Zeichen(char *line)
    {
    
       while(*line != '\0') 
       {
          if(*line == ' ')
          {
             *line = '\0';
             line--;
          }
       line++;
       }
    }
    

    Bin ich damit auf dem richtigen Weg oder geht es so garnicht? Ich finde da halt keinen richtigen weg einfach das Leerzeichen durch nix zu ersetzten.


  • Mod

    Was passiert wohl, wenn du mittentdrin ein Nullzeichen setzt? Richtig, alle Stringverarbeitungsfunktionen (inklusiver deiner eigenen) denken dass von nun an die Zeichenkette an dieser Stelle zu ende ist.

    Du musst das Zeichen schon wirklich entfernen. Zwei einfache Strategien wären:
    a) Alle Zeichen danach eins aufrücken lassen
    b) Alles kopieren und die Leerzeichen nicht mit kopieren

    Ich würde b) nehmen mit anschließendem zurück Kopieren der bereinigten Zeichenkette in das übergebene Array.



  • Ok, ich dachte mir schon das soetwas kommt. Dann werde ich das mit b) lösen, danke.



  • Du kannst auch zwei Zeiger nehmen.
    Am Anfang zeigen beide auf den Stringanfang. Der eine läuft durch den String und den zweiten erhöhst du immer, solange es kein Leerzeichen ist.

    Du musst natürlich die Daten zwischen den Zeigern austauschen.

    Oder du bemühst die Forensuche, denn das gabs schon mal.



  • So jetzt hab ich das nochmal versucht aber irgendwie steht in dem originalen Text nach der Methode wieder das selbe wie vorher 😞

    void entferne_Zeichen(char *p_string)
    {
        char text[20];
        char *p_filtered_string = text;
    
        while (*p_string != '\0')
        {
            if (*p_string != ' ')
            {
                *p_filtered_string = *p_string;
                p_filtered_string++;
            }
            p_string++;
        }
        *p_filtered_string = '\0';
    
               *p_string = *p_filtered_string;
    
    }
    


  • Tarsuinn schrieb:

    So jetzt hab ich das nochmal versucht aber irgendwie steht in dem originalen Text nach der Methode wieder das selbe wie vorher 😞

    Oh Wunder.. versuch doch nochmal genau nachzuvollziehen was Du da eigentlich machst.
    Nur so als Tipp: Gib mal als erstes ein Leerzeichen ein 🙂



  • cooky451 schrieb:

    Tarsuinn schrieb:

    So jetzt hab ich das nochmal versucht aber irgendwie steht in dem originalen Text nach der Methode wieder das selbe wie vorher 😞

    Oh Wunder.. versuch doch nochmal genau nachzuvollziehen was Du da eigentlich machst.
    Nur so als Tipp: Gib mal als erstes ein Leerzeichen ein 🙂

    Hmmm wenn ich als erstes ein Leerzeichen setzte dann passiert das was soll, es steht nicht in text. Wenn die Funktion durchgelaufen ist steht im Array text auch das gewünschte Ergebniss, aber wenn ich dann dem Zeiger p_string mit

    p_string = text;
    

    den neuen Text zuweisen möchte geht das auch, selbst dieser Aufruf bringt noch das gewünschte Ergebniss:

    printf("%c\n", *p_string);
    printf("%c\n", *(p_string+1));
    

    aber solbald ich außerhalb der Funktion den text ausgebe ist alles wie vorher, das kann doch nicht so schwer sein 🙄



  • void entferne_Zeichen(char *p_string)
    {
        char text[20] *p_filtered_string = text, *merkeBeginn = p_string;
    
        while (*p_string != '\0')
        {
            if (*p_string != ' ')
            {
                *p_filtered_string = *p_string;
                p_filtered_string++;
            }
            p_string++;
        }
        *p_filtered_string = '\0';
    
        strcpy( merkeBeginn, text );
    
    }
    


  • Danke, also doch nochmal mit Stringfunktion kopieren, daran hatte ich nicht gedacht, bzw. das wäre mir garnicht eingefallen.



  • Ein

    char *p_filtered_string = p_string;
    

    am Anfang tut es auch. Dann kann man auf das strcpy verzichten.


Log in to reply