Mailinglist Archive: opensuse-programming-de (124 mails)

< Previous Next >
Re: Was ist eine gueltige Message-ID?
  • From: Thorsten Haude <linux@xxxxxxxxxxxxxx>
  • Date: Sat, 3 Aug 2002 20:52:30 +0200
  • Message-id: <20020803185230.GJ1018@xxxxxxxxxxxxxxx>
Moin,

* Jan Trippler <Jan.Trippler@xxxxxxxxxxx> [02-08-03 16:49]:
On Sam, 03 Aug 2002 at 00:34 (+0200), Thorsten Haude wrote:
* Jan Trippler <Jan.Trippler@xxxxxxxxxxx> [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

< Previous Next >
Follow Ups