Moin,
* Jan Trippler
On Sam, 03 Aug 2002 at 00:34 (+0200), Thorsten Haude wrote:
* Jan Trippler
[02-08-02 22:04]: Die Länge eines Strings in C ist _nie_ unbekannt. Nutze strlen(), dann erfährst auch Du sie!
Ähh... *Du* hattest angedeutet, daß ein strlen zu teuer ist.
Ja, das meine ich auch nach wie vor. Mir ging es um Deinen Satz mit den unbekannten String-Längen. Was machst du hier für eine Argumentation? Du hast was gegen Strings unbekannter Länge, ich nenne strlen. Du willst strncmp nutzen, weil Du (was ich immer noch nicht kapiere) behauptest, dass strcmp über die 0 hinwegliest (oder lesen könnte). Ich behaupte, dass dann immer zusätzlicher Aufwand durch die Ermittlung der Länge auftaucht. Was widerspricht sich da in meiner Argumentation?
Nichts, ich kann Dir in diesem Punkt nicht mehr folgen.
Du hast bei einem strncmp() _immer_ den zusätzlichen Aufwand, die String-Länge prüfen, bestimmen, übergeben zu müssen.
Nein, gewöhnlich haben Strings eine #definierte maximale Länge, die man dann auch nett in strncmp() benutzen kann.
Gewöhnlich haben _statisch_ deklarierte Strings eine definierte maximale Länge - was ist mit dynamisch erzeugten (Stichwort malloc)?
An welchen Programmen hast Du bisher gearbeitet? Kann man die #definierte Länge wohl auch dazu benutzen, einen String zu allozieren? Wenn nein, warum nicht?
Weil man sie nicht vorher kennt!
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.
Und auch bei statischen Strings musst Du rechnen, nämlich dann, wenn die Definitionen zweier Strings sich unterscheiden. Dann musst Du nämlich feststellen, welche der beiden Längen Du nimmst.
min(len1, len2)
Ja, z. B. - also zusätzlicher (unnötiger) Aufwand.
Ich sehe nicht, daß es garantiert in allen Fällen unnötig ist.
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 ist nochmal eine schöne Zusammenfassung von dem, worum es hier geht. Allerdings ist immer noch unklar, ob über die \0 hinaus verglichen wird.
Da Du den Code-Schnipsel offensichtlich nicht gelesen / verstanden hast, hier noch mal eine kommentierte Version:
Danke.
Der Code wird im Gegenteil dann leichter lesbar sein, wenn sich der Leser nicht auch noch darüber Gedanken machen muß, ob mal wieder eine Funktion aus string.h aus dem Ruder läuft.
Diese Begründung ist ja nun absoluter Quatsch, sorry! Woher soll denn Dein Leser wissen, dass nicht strncmp() aus dem Ruder läuft?
Sinnvollerweise benutzt man für das n den gleichen Wert, der für die Allozierung des Strings benutzt worden ist. Dieser Wert hat dann noch einen brauchbaren Namen wie MAX_PATH_LEN, dann kann man das schon erkennen.
Nochmal: Geh doch mal auf Deine eigenen Argumente ein: *...Funktion aus string.h aus dem Ruder läuft...*; Ich: *..wissen, dass nicht strncmp() aus dem Ruder läuft...* - was hat diese Deine Antwort mit dem Text darüber zu tun?
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.
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.
Dann müsste aber der folgende Code-Schnipsel ein ziemlich merkwürdiges Resultat ergeben:
Ich hab's nicht verstanden, was meinst Du? Thorsten -- This is so cool I've to go to the bathroom. - Calvin