
On Sam, 03 Aug 2002 at 20:52 (+0200), Thorsten Haude wrote: [...]
Ok, das führt mir alles zu weit weg. Es gibt bestimmt eine Menge Fälle, in denen man strcmp() benutzen soll, aber eben auch Fälle, in denen es nicht nötig ist.
Es gibt Fälle, in denen man strncmp() benutzen soll (wenn einen z. B. nur die ersten n Zeichen eines Strings interessieren), ansonsten ist es nicht nötig. Es bedeutet zusätzlichen Aufwand, der meist unnötig ist. [Ermittlung der String-Länge]
Ich sehe nicht, daß es garantiert in allen Fällen unnötig ist.
Nein, in allen nicht. Aber in dem, an dem sich diese Diskussion hier entzündete schon.
Das willst du alles hart kodiert in das Programm schreiben? Wie flexibel und gut wartbar ;-)
Dafür gibt's #defines.
Und jedesmal ein neuer Build, wenn sich irgendwo eine Länge ändert. Cool! Den Versionszähler kann man sich dann als Ventilator in die Küche hängen ;-)
Huh? Warum sollte sich die Länge so häufig ändern.
Das war ein Witz - deshalb auch der Smiley. Solche Längen werden sich nicht oft ändern, aber ab und zu schon. Wenn ich nur wegen der Verwendung solcher #defines in strncmp und Konsorten ständig neue Versionen bauen muss, ist das unnötig - das meinte ich damit. [...]
Man benutzt halt einen festgelegten Wert für die Allozierung und den gleichen Wert für die Begrenzung der strn*-Funktionen. Das ist auch kein geheimer Trick, sondern relativ naheliegend, darum kann das auch der Leser wissen.
Mir fehlte der Zusammenhang. Du hast sinngemäß geschrieben, dass dem Leser den Code dann übersichtlicher wird, wenn er sich nicht noch Gedanken darüber machen muss, ob wieder eine Funktion aus string.h *aus dem Ruder gelaufen ist*. Ich habe daraufhin erwidert, dass er sich da bei strncmp genausowenig wie strcmp sicher sein kann, es also keinen Unterschied macht. Wie man defines verwendet, ist mir schon klar ;-)
BTW: Gehen wir mal davon aus, dass strcmp() nicht bei 0 aufhört. Dann sollte man doch davon ausgehen, dass auch strncmp() nicht bei 0 aufhört, oder?
Man sollte nicht davon ausgehen, daß es nicht passiert. Wahrscheinlich ist es nicht.
Ja, hmm - äh wie nochmal? Stimmst Du mir zu oder behauptest Du, dass strncmp eine gänzlich andere Implementierung vorlegt als strcmp?
Dann müsste aber der folgende Code-Schnipsel ein ziemlich merkwürdiges Resultat ergeben:
Ich hab's nicht verstanden, was meinst Du?
Sorry, ich sah gerade, dass da noch eine Kleinigkeit fehlt, um meine Argumentation verständlich zu machen, das ergänze ich hier mal. Ich habe auch zum Vergleich noch die strcmp-Werte angehängt, um zu zeigen, dass es keinen Unterschied macht (wäre ja auch schlimm in diesem Fall). <schnipp> #include <string.h> #include <stdio.h> #define C_TXTLEN 16 int main (int argc, char *argv[]) { char s1[C_TXTLEN], s2[C_TXTLEN]; /* beide String ueber die gesamte Länge mit 0 initialisieren */ memset (s1, 0, C_TXTLEN); memset (s2, 0, C_TXTLEN); /* in beide Strings die Zeichenfolge "ein string" kopieren ab Stelle 0, also von Stelle 0 - 9 mit dem Text belegen */ strcpy (s1, "ein string"); strcpy (s2, "ein string"); /* erster Vergleich: Die Strings sind gleich, also lautet die Ausgabe: (s1 = <ein string>) == (s2 = <ein string>)? strncmp: Ja; strcmp: Ja */ printf ("(s1 = <%s>) == (s2 = <%s>)? strncmp: %s; strcmp: %s\n", s1, s2, strncmp (s1, s2, C_TXTLEN) ? "Nein" : "Ja", strcmp (s1, s2) ? "Nein" : "Ja"); /* in String 1 + 2 an Stelle 7 eine 0 kopieren; zusaetzlich in * String 2 an Stelle 8 + 9 die Werte 'c' und 'k' kopieren */ *(s1 + 7) = 0; *(s2 + 7) = 0; strcpy (s2 + 8, "ck"); /* die beiden Strings unterscheiden sich jetzt an den Stellen 8 + 9: in s1 steht da "ng", in s2 "ck" */ /* zweiter Vergleich: Wenn strncmp() nicht bei 0 aufhoert, muss hier ein Ergebnis != 0 herauskommen, tatsaechlich aber ergibt das: (s1 = <ein str>) == (s2 = <ein str>)? strncmp: Ja; strcmp: Ja */ printf ("(s1 = <%s>) == (s2 = <%s>)? strncmp: %s; strcmp: %s\n", s1, s2, strncmp (s1, s2, C_TXTLEN) ? "Nein" : "Ja", strcmp (s1, s2) ? "Nein" : "Ja"); return (0); } <schnapp> Jan