Leerzeichen aus Char-Array entfernen
-
Hallo Leute,
seit beginn meines Studiums müssen wir jetzt in C Programmieren. Die Zeit in der ich das mal gemacht habe ist etwas her, deshalb brauch ich mal ne Denkhilfe von euch.
Geht darum aus einem Char-Array die Leerzeichen zu eliminieren.Vorne weg: Unser Prof ist etwas propritär und verbietet es uns mit Zeiger und dynamischer Speicherverwaltung zu arbeiten(zumindest Momentan).
Ich hab jetzt zwei Lösungen, die eine arbeitet mit Zeigern, weil ich nich anders weiter wusste, die andere ohne, doch die Funktioniert nicht so recht und gibt mir immer einen invaliden String aus. Könnt ihr mir kurz auf die Sprünge helfen was an der einen Lösung falsch ist?Lösung mit Zeiger:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[] = "Horst Hansen Ist Bloed"; char t[] = ""; char *splitted = strtok(name," "); while(splitted != NULL) { strcat(t,splitted); splitted = strtok(NULL," "); } printf("%s",t); return 0; }
Lösung ohne Zeiger, wo ich mir immer irgendwie den Eingabestring zerschieße was ich mir rein gar nich erklären kann.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[] = "Horst Hansen Ist Bloed"; char t[] = ""; int i = 0; int length = strlen(name); for(i;i<length;i++) { if(name[i] != ' ') { t[i] = name[i]; } } printf("%s\n",name); printf("%s",t); return 0; }
Komischer Weiße sieht der Eingabestring nach der zweiten Lösung immer wie folgt aus:
orsttHansennIsttBloedd
und der Zielstring so:
HorsttHansennIsttBloedd
Ich versteh ncih so ganz warum er teilweise die Buchstaben doppelt reinschreibt und in mir sogar den Eingabestring zerschießt obwohl ich den doch gar nich manipuliere.
Ich arbeite mit Code::Blocks.
-
Omg ich idiot.
Ich habe ja so viele Fehler begangen.
Hier eine richtige Lösung:char name[] = "Horst Hansen Ist Bloed"; char t[128]; int i = -1; int j = -1; int length = sizeof(name); while(i<length) { if(name[++i] != ' ') { t[++j] = name[i]; } } printf("%s\n",name); printf("%s",t);
Kann geschlossen werden.
-
Alle deine 3 Varianten sind Schrott. Mit jeder wärst du bei deinem Prof. durchgefallen. Du solltest dir vorab mal überlegen (evtl. steht es auch in deiner Aufgabenstellung) wo der von Leerzeichen befreite Zielstring landen soll, im Original oder in einer Kopie. Für Fall 1 müsstest du innerhalb des Strings Zeichen verschieben, für Fall 2 müsstest zu erstmal einen Speicherbereich definieren, in welchem das Ergebnis abgelegt wird. Außerdem wäre für eine strtok-Variante auch wichtig zu erfahren, ob der Originalstring zerstört werden darf oder nicht.
-
Ziel ist es,das ich aus dem Original den Namen mit entfernten Leerzeichen in einen neuen String packe um diesen dann als Datei-Namen zu benutzen.
Wenn die Lösungen Schrott sind, wäre es hilfreich wenn du das nicht nur sagst sondern die Fehler auch aufzeigst, sonst ist der Lerneffekt für mich nich sehr groß, ohne zu erfahren wo mein Fehler liegt.
Das Lösung 1 Blödsinn ist, hab ich mitlerweile auch mitbekommen.
Aber warum ist die dritte nicht geeignet?
-
Lösung 3 ist schon in Ordnung, wenn du keine dynamische Speicherverwaltung benutzen darfst, du musst aber immer im Hinterkopf behalten, dass t irgendwann überlaufen kann und daher groß genug dimensioniert ist (ist ja der Fall).
int i und j würde ich nicht mit -1 initialisieren, sondern mit 0 und anschließend das Postinkrement verwenden (ist aber meine persönliche Meinung).printf("%s\n",name); // sollte besser so aussehen puts(name); // so dass ich für mich eher schreiben würde int i = 0, j=0; int length = strlen(name)+1; // Nullterminierung while(i<length) { if(name[i] != ' ') { t[j++] = name[i]; } ++i; } puts(name); puts(t);
-
char name[] = "Horst Hansen Ist Bloed"; char t[ausreichendgrossmindstrlenname+1]; int i,j; for( i=j=0; name[i]; ++i ) if( name[i]!=' ' ) t[j++]=name[i]; t[j]=0;
-
Danke für die Tips
Ja dürften wir dynamische Speicherverwaltung und Zeiger benutzen dann hätte ich das auch über nen Char-Zeiger gelöst.
Das ich das groß genug dimensionieren muss, war mir klar, danke trotzdem für die Tips.
-
Ein kleines Experiment:
#include <stdio.h> #include <string.h> #include <stdlib.h> void eraseChar(char *str, char ch); int main() { char *d; char test[] = "Ha l l o, W el t! ! !"; eraseChar(test, ' '); printf("'%s'\n", test); d = strdup("Ha l l o, We e e e lt! ! !"); // Dynamisch eraseChar(d, ' '); printf("'%s'\n", d); free(d); return 0; } void eraseChar(char *s, char ch) { unsigned int i, c; do { c = 0; for (i = 0; i < strlen(s); ++i) { if (s[i] == ch) { const char t = s[i]; s[i] = s[i + 1]; s[i + 1] = t; ++c; } } } while (c > 0); }
Es ist sicher nicht so schön, aber es sollte zumindestens egal sein, ob das Array dynamisch angelegt wurde oder nicht.