Selbst definiertes Zeichen aus String löschen



  • Hallo erstmal.
    Meine Aufgabe besteht darin einen String einzulesen, einen character einzulesen und alle Vorkommnisse dieses Characters aus dem String zu löschen.
    Ich hab das Programm mal so geschrieben dass er den jeweiligen char durch ein Leerzeichen ersetzt, doch das ist nicht miene Aufgabenstellung.

    Beispiel : Eingelesener String : ajkfdikgdfhdkf
    Eingelesener Character . k
    Ausgabe soll dann sein : ajfdigdfhdf

    Wie stell ich das an ?

    #include<stdio.h>
    void loeschen(char *target, char c);
    
    int main()
    {
        char a,t[1000];
    
        printf("Original String :");
        gets(t);      
    
        printf("\nCharacter : ");
        a=getchar();                              
    
        loeschen(t,a);                         
    
        printf("\nChanged String : ");
        puts(t);                                 
        printf("\n");
    
    system("pause");
    return 0;
    }
    
    void loeschen(char* target, char c)
    {
        for(;*target!='\0';++target)       
        {
           if(*target==c)                
           {
              *target=' ';   
           }
        }
    }
    


  • Im Prinzip hast du die Aufgabe schon gelöst. Statt die Zeichen zu löschen kannst du jetzt die eingelesenen Zeichen in einen anderen String schmeissen, und den dann ausgeben.



  • Danke. Aber gehts nicht auch ohne einen 2. String ? Ich würde gern das betreffende Zeichen löschen und alle nachfolgenden nach links rücken. Nur hab ich keine Ahnung wie dieser Algorithmus funktionieren könnte. Besonders das löschen ohne ne Lib Funktion zu verwenden.



  • Du machst dir zwei Zeiger (oder Indizes) einen zum Schreiben, einen zum Lesen. Beide zeigen auf den ersten Buchstaben im String. Nun gehst du in einer Schleife über den String (eben bis der Lesezeiger auf eine terminierende 0 zeigt) und schaust immer, ob der Lesezeiger auf das zu löschende Zeichen zeigt. Wenn nicht, dann schreibst du das Zeichen des Lesezeigers auf das Zeichen des Schreibzeigers und inkrementierst den Schreibzeiger.
    Nach dieser Abfrage inkrementierst du den Lesezeiger.
    Nach der Schleife setzt du das Element des Schreibzeigers noch auf '\0' um den String zu terminieren.



  • Rachanol schrieb:

    [...] Ich würde gern das betreffende Zeichen löschen und alle nachfolgenden nach links rücken. [...]

    Dann machs doch genau so, wie du's auch sagst:

    #include <string.h>
    
    void remove_char( char *string, const char ch )
    {
    	char	*cur = string;
    	char	*end = string + strlen( string );
    	char	*i = 0;
    
    	for( ; cur != end; ++cur ) {
    
    		if( *cur == ch ) {
    
    			for( i = cur; i != end; ++i ) {
    
    				*i = *( i + 1 );
    			}
    		}
    	}
    }
    

    cheers, Swordfish

    [edit]Oh Gott bin ich laaangsam.[/edit]



  • Erscheint mir unnötig kompliziert.

    void remove_char (char *string, const char ch) {
        const char *read = string;
        char *write = string;
    
        while (*read) {
            if (*read != ch) {
                *write++ = *read;
            }
            read++;
        }
        *write = '\0';
    }
    


  • Tim schrieb:

    Erscheint mir unnötig kompliziert.

    mir auch:

    void remove_chars (char *str, char c)
    {
      char *p = str;
      while (*str)
      {
        if (*str != c)
          p++;
        *p = *++str;
      }
    }
    

    🙂



  • void remove_chars (char *str, char c)
    {
      char *p = str;
      while (*str)
      {
        p += (*str != c);
        *p = *++str;
      }
    }
    

    So, nun haben wir den Weg von "unnötig kompliziert" nach "unnötig trickreich" vollzogen 😃



  • ROFL

    cheers, Swordfish



  • Tim schrieb:

    So, nun haben wir den Weg von "unnötig kompliziert" nach "unnötig trickreich"

    schlimmer geht's immer:

    void remove_chars (char *str, char c)
    {
      for (char *p=str; *(*str != c ? ++p : p) = *++str;);
    }
    

    ^^c99 und undefined behaviour. geht aber bei mir.
    🙂



  • schlimmer geht's immer:

    void remove_chars_rec(char *str, char *walk, char c)
    {
        if (*str != c) *walk++ = *str;
        if (!*str) return;
        remove_chars_rec (str + 1, walk, c);
    }
    #define remove_chars(str, c) remove_chars_rec(str, str, c)
    


  • Blödsinn.
    So gehts:

    void remove_chars_rec(char *str, char *walk, char c)
    {
        if (*str != c) *walk++ = *str;
        if (*str) remove_chars_rec (str + 1, walk, c);
    }
    

Anmelden zum Antworten