Funktion zur Messung der Länge eines Strings!
-
Hallo C Gurus!
int laenge(char * s); int main(int argc, char* argv[]) { if(laenge("") == 0) printf("Funktioniert"); if(laenge("Test") == 4) printf("Funktioniert"); if(laenge(NULL) == 0) printf("Funktioniert"); return 0; } int laenge(char *s) { int i=0; while(*(s++)) i++; return i; }
Jetzt bekomme ich bei den ersten drei Funktionsaufrufen das korrekte Ergebnis,
beim dritten jedoch nicht. Wieso?
Es sollte irgendwie funktionieren NULL zu detektieren, aber was mache ich hier falsch?Danke!
Grinch
-
Den Wert von s prüfst du doch nirgends. Es ist ein riesiger Unterschied ob ein Zeiger den Wert 0 hat oder auf den Wert 0 zeigt.
Ein paar Verbesserungen:
-Allgemein würde ich den Fall, dass der Zeiger 0 ist, gar nicht abfangen. Also erübrigt sich die Frage sowieso.
-const correctness: Da du das wo drauf s zeigt nicht änderst, sollte es vom Typ const char* sein. Funktioniert in C zwar wegen Sonderregeln trotzdem mit Zeichenkettenliteralen, aber ist kein guter Stil und sollte man sich für andere Anwendungen gleich richtig angewöhnen.
-Da eine Länge nie negativ sein kann, sollte der Rückgabetyp nicht vorzeichenbehaftet sein. Der vordefinierte typedefsize_t
aus stddef.h bietet sich an.Diese drei Änderungen sind übrigens auch genau die Dinge, die deine Funktion anders macht als die Funktion strlen aus der Standardbibliothek. Wenn man die Standardbibliothek nachprogrammiert (hoffentlich nur zur Übung!), dann ist es oft gut, mal zu vergleichen, wie diese etwas umsetzt. Die ist im Großen und Ganzen schon recht gut durchdacht.
-
Vielen Dank für die Rückmeldung.
Das mit const und dem positiven Wert leuchtet mir total ein.
Die Übung war ja gedacht, dass ich den Zweck von strlen erfülle ohne es einzusetzen.Soweit habe ich deine Korrekturen verstanden.
Die Vorgabe war jedoch auch der Funktionsprototyp "int laenge(char *s)".
Das bedeutet ich muss damit arbeiten.
Jetzt habe ich leider nicht herauslesen können, ob es unmöglich ist beim einlesen von NULL den Wert 0 zurückzugeben, oder ob ich nur etwas anders abfragen muss innerhalb der Funktion. Der Rest hat auf Anhieb funktioniert und im Prinzip ist ja "" gleichbedeutend mit NULL wenn mich nicht alles täuscht.
-
Du täuscht dich.
"" ist ein String, der nur aus dem Zeichen '\0' besteht. Er steht also irgendwo im Speicher und man darf darauf zugreifen.
NULL bedutet ungültiger Zeiger. Er verweist auf die Adress 0. Du darfst von dort i.A. auch keine Daten lesen.
NULL kannst du ganz einfach abfragen:
if (s == NULL) return -1;
Da es aber sinnlos ist, die Stringlänge von einem NULL-Zeiger zu bekommen, ist es ganz einfach verboten, deiner Funktion einen NULL-Zeiger zu übergeben.
Wenn das doch vorkommen kann, muss der Programmierer selber dafür sorgen, dass dies nicht auftritt. Dann muss er die Prüfung machen.
Kostet ja schließlich nur Zeit in laenge.
-
Und selbst wenn du in der Funktion prüfst ob du einen Nullzeiger bekommst kannst du nicht viel machen. Du kannst höchstens -1 zurückgeben, aber das führt trotzdem zu Problemen im Aufrufenden Code wenn es dort nicht bedacht wurde.
Da kann man auch gleich vorher prüfen ob ein Nullzeiger vorliegt.
-
Vielen Dank!
Ich verstehe es soweit und erkenne auch den Sinn nicht dahinter NULL zu übergeben.
Nichtsdestotrotz stürzt immer wenn ich NULL abfrage das Programm nach der zweiten Zeile ab und gibt mir die dritte Zeile gar nicht mehr aus. Egal wie ich die Zeile if (s == NULL) einbinde, erscheint mir diese Absturzmeldung...
Hm...
-
C Grinch schrieb:
Egal wie ich die Zeile if (s == NULL) einbinde,
Die muss vor dem
while
stehen.*
Und dasreturn -1;
gehört dazu.*Bevor du s dereferenzierst.
-
C Grinch schrieb:
Die Vorgabe war jedoch auch der Funktionsprototyp "int laenge(char *s)".
Das bedeutet ich muss damit arbeiten.Diesen Schluss liest man hier so oft. Ich verstehe es einfach nicht. Werden eure Hausarbeiten von Maschinen bewertet? Du schreibst, die Verwendung des 'const' an dieser Stelle leuchtet dir völlig ein. Dann schreib es doch auch hin! Im schlimmsten Fall wirst du gefragt, warum das da steht und du antwortest eben drauf. In der Regel würde ich jedoch erwarten, dass die Änderung entweder gar nicht bemerkt oder mit einem Lob versehen wird, weil du mitgedacht hast.
Bei Aufgabenstellungen an der Uni darf man das nämlich meist. Wie auch sonst im Leben.
-
EWHYOHWHY schrieb:
C Grinch schrieb:
Die Vorgabe war jedoch auch der Funktionsprototyp "int laenge(char *s)".
Das bedeutet ich muss damit arbeiten.Diesen Schluss liest man hier so oft. Ich verstehe es einfach nicht. Werden eure Hausarbeiten von Maschinen bewertet? Du schreibst, die Verwendung des 'const' an dieser Stelle leuchtet dir völlig ein. Dann schreib es doch auch hin! Im schlimmsten Fall wirst du gefragt, warum das da steht und du antwortest eben drauf. In der Regel würde ich jedoch erwarten, dass die Änderung entweder gar nicht bemerkt oder mit einem Lob versehen wird, weil du mitgedacht hast.
Bei Aufgabenstellungen an der Uni darf man das nämlich meist. Wie auch sonst im Leben.
Vielleicht an der Uni. Sonst im Leben selten. Und in der Schule schon mal gar nicht.