Veröffentlicht 10. November 200915 j kann mir mal jemand helfen. bin heute schon den ganzen tag am verzweifeln. ich hab folgendes problem.(bin noch ein neuling beim programmieren^^) ich will unten einen string eingeben und aus diesem string die leerzeichen löschen. irgendwie funktioniert meine funktion aber nicht. sie hört nach dem ersten leerzeichen auf?!?!?!? hier mal das programm: #include <stdio.h> #include <string.h> void entfernen (char *s){ char *ptr ; while(*s != '\0') { if (*s != ' ') { *ptr++ = *s; } *s++; } *ptr = '\0'; s = ptr; } main(){ char string[20]; printf("bitte etwas eingeben: \n"); scanf("%s", &string); entfernen (string); printf("%s", string); return 0; }
10. November 200915 j Das liegt nicht an deiner Funktion. Lass dir doch den String mal nach dem Einlesen ausgeben Und nebenbei: "frage?" ist ein denkbar schlechter Threadtitel. Eine Frage hat hier nämlich so ziemlich jeder, der einen Thread erstellt. Ich hab das mal für dich angepasst, beim nächsten Thread bitte selbst einen aussagekräftigen Titel ausdenken.
10. November 200915 j oke, war vlt ne blöde Überschrift.... hast du mich falsch verstanden oder ich dich. ich schreibe z.B bla bal. ich möchte das dieses Leerzeichen gelöscht wird und dann dann da steht: "blabla"
10. November 200915 j sorry das ich hier so viele poste, aber ich bin zum eresten mal in einem forum und kenn mich noch nicht so gut aus. also ich denke das irgendwas an den algorithmus nicht stimmt in meiner funktion. ich lass mir ja danach den string ausgeben in der printf. aber bei der ausgabe kommt nicht das raus was ich eingentlich vor hatte^^
10. November 200915 j Das Programm enthält mehrere Fehler. Unter anderem den bereits angesprochenen Fehler in der Zeile mit dem scanf Aufruf.
11. November 200915 j wieso bitte ist das falsch mit scanf? scanf mit %s liest nur bis zum ersten Leerzeichen ein. Es steht von Anfang an nicht mehr in deinem String drin. Darum hatte ich dir auch den Tipp gegeben, den String nach der Eingabe einfach mal auszugeben, dann hättest du das gesehen. Wenn du eine ganze Eingabezeile einlesen willst, benutz fgets mit stdin. Und noch ein paar Anmerkungen: Dein Zeiger ptr ist nicht initialisiert. Es wundert mich, dass dir das Programm nicht sofort um die Ohren fliegt.Bei diesem Code bewirkt das Sternchen gar nichts:*s++;Du kannst innerhalb der Funktion den Zeiger s "umbiegen", das wirkt sich aber nicht auf den Zeiger auf, der beim Aufruf der Funktion benutzt wurde, weil die Funktion mit einer Kopie arbeitet.
11. November 200915 j Du kannst innerhalb der Funktion den Zeiger s "umbiegen", das wirkt sich aber nicht auf den Zeiger auf, der beim Aufruf der Funktion benutzt wurde, weil die Funktion mit einer Kopie arbeitet. Sind Zeigerparameter nicht Call by Reference? hmm, notfalls muss man halt die Adresse des Arrays übergeben.
11. November 200915 j Sind Zeigerparameter nicht Call by Reference?Zeiger sind der Mechanismus, wie man in C Call-by-Reference umsetzt. Dadurch kann man das ändern, worauf dieser Zeiger verweist. Der dazu verwendete Zeiger selbst ist nach wie vor Call-by-Value.
11. November 200915 j Dadurch kann man das ändern, worauf dieser Zeiger verweist. Das wird doch aber mit s = ptr; gemacht. Oder hab ich jetzt was falsch verstanden? :beagolisc
11. November 200915 j Diese Zuweisung ändert nur den Zeiger. Das char-Array, auf das er vorher gezeigt hat, wird nicht beeinflusst.
11. November 200915 j ich hab jetzt mal ein bisschen rumprobiert und oben in der funktion meinem *ptr s zu gewiesen und bei *s++ den zeiger weggelassen und auf einmal funktioniert es ?!?! das mit dem einlesen mit scnaf hab ich nicht gewusst. hab jetzt die fgets verwedendet, danke für den tipp sieht jetzt so aus: #include <stdio.h> #include <string.h> void entfernen (char *s){ char *ptr = s ; while(*s != '\0') { if (*s != ' ') { *ptr++ = *s; } s++; } *ptr = '\0'; s=ptr; } main(){ char string[20]; fgets(string,sizeof(string),stdin); entfernen(string); printf("%s",string); return 0; }
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.