Selbst definiertes Zeichen aus String löschen
-
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); }