hame Geschrieben 10. November 2009 Geschrieben 10. November 2009 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; } Zitieren
Klotzkopp Geschrieben 10. November 2009 Geschrieben 10. November 2009 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. Zitieren
hame Geschrieben 10. November 2009 Autor Geschrieben 10. November 2009 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" Zitieren
hame Geschrieben 10. November 2009 Autor Geschrieben 10. November 2009 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^^ Zitieren
Bubble Geschrieben 10. November 2009 Geschrieben 10. November 2009 Das Programm enthält mehrere Fehler. Unter anderem den bereits angesprochenen Fehler in der Zeile mit dem scanf Aufruf. Zitieren
hame Geschrieben 10. November 2009 Autor Geschrieben 10. November 2009 wieso bitte ist das falsch mit scanf? Zitieren
Klotzkopp Geschrieben 11. November 2009 Geschrieben 11. November 2009 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. Zitieren
TDM Geschrieben 11. November 2009 Geschrieben 11. November 2009 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. Zitieren
Klotzkopp Geschrieben 11. November 2009 Geschrieben 11. November 2009 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. Zitieren
TDM Geschrieben 11. November 2009 Geschrieben 11. November 2009 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 Zitieren
Klotzkopp Geschrieben 11. November 2009 Geschrieben 11. November 2009 Diese Zuweisung ändert nur den Zeiger. Das char-Array, auf das er vorher gezeigt hat, wird nicht beeinflusst. Zitieren
TDM Geschrieben 11. November 2009 Geschrieben 11. November 2009 Ok, hat Klick gemacht. :floet: Zitieren
hame Geschrieben 11. November 2009 Autor Geschrieben 11. November 2009 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; } Zitieren
Klotzkopp Geschrieben 11. November 2009 Geschrieben 11. November 2009 Die Zuweisung an s am Ende der Funktion kannst du auch noch weglassen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.