Leerzeichen entfernen
-
Hallo hab eine Funktion geschrieben die mir alle Leerzeichen entfernen soll. Allerdings ist die Ausgabe nachher die gleiche wie die Eingabe und ich komme nicht dahinter wo das Problem ist
char ohneblanks(char * s) { char *roh; char fertig; roh=s; for(int i=0;i < strlen(roh);i++) { if (roh[i] == (int)' ') { } else { fertig = fertig +roh[i]; } } return fertig; }
Das ist die Funktion und so rufe ich sie auf:
char s[]="Dies ist bald ein"; ohneblanks(s); printf("%s",s);
Bin für jede hilfe dankbar...
-
mache er sich klar was der unterschied zwischen char* und char ist
-
for(int i=0;i < strlen(roh);i++)
Wie oft wird strlen() aufgerufen?
if (roh[i] == (int)' ')
Den Cast kannst du weglassen.
fertig = fertig +roh[i];
Du hälst
fertig
für eine Stringvariable, an die du jedes Zeichen anhängst, wenn es kein Leerzeichen ist? Wenn ja: das geht nicht, weil es keine Stringvariablen gibt.
-
Den unterschied kenne ich, nur ist mir nicht klar was die auswirkungen sind. Wäre nett wenn mir jemand helfen könnte ich schreibe in 2 stunden KLausur
-
wie löse ich das denn dann ?
-
1. Du veränderst deinen String an keiner Stelle im Code. Der Funktionsaufruf ist also völlig ohne Effekt.
2. Was du lediglich machst, ist eine Summe zu bilden. fertig ist ein char, also ein Zahlenwert (wenn auch bei der Ausgabe als Zeichen dargestellt). Du addierst also ständig Werte auf fertig drauf (und produzierst dabei wahrscheinlich einige Überläufe). Dann gibtst du fertig rurück, verarbeitest diese Rückgabe aber nirgendwo (ist auch besser so, sie ist ja falsch)...
3. Was du willst, ist ein zweiter String (char*). In den kannst du dann alle Zeichen außer Blanks des ersten Strings reinkopieren.
-
kingmarv schrieb:
wie löse ich das denn dann ?
Zuerst einmal musst du etwas Speicher finden, in dem du das Ergebnis zusammensetzt. Also irgendwo Speicher hernehmen oder gleich in das
s[]="Dies ist bald ein"
des Aufrufers schreiben.Mehr verrate ich dir, wenn du mir sagst, wie oft strlen(roh) aufgerufen wird.
-
du kannst es in place lösen. ist aber relativ ineffektiv, wenn viele blanks driehnen sind.
-
kagga++ schrieb:
du kannst es in place lösen. ist aber relativ ineffektiv, wenn viele blanks driehnen sind.
code vegessen:
void inefficient_blank_removal(char* s) { char* p; while(*s) { p=s; if(*s==' ') while(*s) *s=*(s+1), s++; s=p+1; } } int main() { char blah[] = "zieh blank, baby"; inefficient_blank_removal(blah); puts(blah); return 0; }
-
Also ich habe in einer alten Klausur die selbe Aufgabe und es funktioniert bei mir auch soweit, aber ich komme nur darauf, wie ich die Leerzeichen im String durch andere Zeichen ersetze, aber nicht wie ich sie gänzlich entferne.
for(i=0;i<=len;i++) { pstring=&string[i]; if(string[i] == ' ') { *pstring='.'; // Was kann ich hier statt dem Punkt einsetzen, damit das Leerzeichen aus dem String verschwindet, also der String auch kürzer wird? } }
-
ah jetzt weiß ich was ihr meint:
warschein mit strcat() immer die "nicht leerzeichen" an den string dranhängen oder ?
hab da allerdings nen Konvertierungsproblem
strcat(fertig, s[i]);
Da schmeißt er folgenden fehler aus:
Fehler 2 error C2664: 'strcat': Konvertierung des Parameters 1 von 'char' in 'char *' nicht möglich
Mir ist schon klar warum das nicht geht weil das eine ne normale Char ist und das andere nen Zeiger, aber wie krieg ich die kompatibel ... Sry kenn mich bhalt nich so gut aus ? Wäre dankbar für die antwort weil ich jetzt gleich zur klausur muss..Achja.. strlen(roh) wie so oft aufgerufen wie i nich größe als die länge von roh ist ?
-
kingmarv schrieb:
Achja.. strlen(roh) wie so oft aufgerufen wie i nich größe als die länge von roh ist ?
strlen(roh) wird
strlen(roh)
mal aufgerufen.Auch für strcat() gilt, dass du zuerst Speicher haben musst, in den du ausgeben kannst. Besser ist, du nimmst einen Zeiger auf den Ausgabebereich zur Hand, und schreibst das aktuelle Zeichen dorthin. Den Ausgabe-Zeiger erhöhen, wenn was geschrieben wurde.
-
µngbd schrieb:
strlen(roh) wird
strlen(roh)
mal aufgerufen.Einmal würde natürlich auch reichen.
-
und auf strcat kann man auch verzichten
-
Jolka schrieb:
Also ich habe in einer alten Klausur die selbe Aufgabe und es funktioniert bei mir auch soweit, aber ich komme nur darauf, wie ich die Leerzeichen im String durch andere Zeichen ersetze, aber nicht wie ich sie gänzlich entferne.
for(i=0;i<=len;i++) { pstring=&string[i]; if(string[i] == ' ') { *pstring='.'; // Was kann ich hier statt dem Punkt einsetzen, damit das Leerzeichen aus dem String verschwindet, also der String auch kürzer wird? } }
nix.
-
Wenn ich eben nichts eingebe kommt ein Fehler, weil nichts drinsteht.
-
pstring=string; for(i=0;i<=len;i++) { if(string[i] != ' ') { *pstring=string[i]; pstring++; } } *pstring=0;
-
kagga++ schrieb:
du kannst es in place lösen. ist aber relativ ineffektiv, wenn viele blanks driehnen sind.
wie kommst du auf sowas also gehen wir mal davon aus wir haben 2 strings mit je 10 länge dann muß ich immer min 10 zeichen zu meiner einfügestelle springen, inplace brauche ich max 10 zeichen, das kann doch schon fast nicht langsamer sein oder?
-
void ohnespace(char* s){ char* p=s; do { if (*s!=' ') *p++=*s; } while(*s++); }
wird ebenfalls inplace ersetzt, man muss nur aufpassen, dass man das Stringende ( "\0" ) mit kopiert, deshalb die do...while Schleife. Hier ist die position des ++ operators wichtig, bzw. nicht egal...
p.s. den oneliner konnte ich mir hier nicht verkneifen- sollte man natuerlich normalerweise schön getrennt schreiben und einrücken und so...
-
Und zum Abschluss noch ein Griff ins Archiv.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-229487.html