
On Son, 28 Jul 2002 at 23:47 (+0200), Thorsten Haude wrote:
Moin,
* Jan Trippler <Jan.Trippler@t-online.de> [02-07-28 21:26]:
On Sam, 27 Jul 2002 at 07:16 (+0200), David Haller wrote:
+ if( hrv == 0 && ! ( (use_fqdn = getenv("EVOLUTION_MSGID_FQDN")) != NULL + && strncmp(use_fqdn, "no\0", 3) == 0) ) {
Nur mal so am Rande: Welchen Sinn hat es hier, strncmp() statt schlicht strcmp(use_fqdn, "no") zu nutzen? strncmp() vergleicht auch nur _höchstens_ 3 Byte, maximal aber bis zum ersten Null-Byte. In welchem Fall also sollte sich hier strncmp anders verhalten als strcmp?
Laut dem C:ARM vergleicht strcmp() bis zum ersten Unterschied. Es wird erwähnt, daß die Strings Null-terminiert sein sollen, aber nicht explizit, daß er bei der \0 aufhört, zu vergleichen.
Selbst wenn es so wäre: "no" hat an 3. Position einen 0-Wert. Hat ihn der erste auch - gut, wenn nicht - auch gut, dann sind die beiden Strings also ungleich. qed! Wo also liegt in diesem Fall der Vorteil von strncmp()? Da steckt eine Konstante im Vergleich!
Außerdem spart das strncmp() jeden weiteren Gedanken über das Thema und ist darum per se besser.
*Umpf* Das ist wohl etwas unüberlegt (vorsichtig formuliert). Beispiel: Gleichheit von zwei _variablen_ Strings unbekannter Länge prüfen. Bis zu welchem Byte prüfst Du? Machst Du erstmal eine strlen() Berechnung, um einen Anhaltspunkt zu haben? Findest du das effizient, wenn das z. B. innerhalb einer Schleife mit mehreren 10^x Iterationen laufen muss? Welche Länge nimmst du als Parameter? String1 oder String2? Sicher alles lösbar, aber nochmal: Was bringt es Dir? Du hast bei einem strncmp() _immer_ den zusätzlichen Aufwand, die String-Länge prüfen, bestimmen, übergeben zu müssen. Du musst in einem C-Programm doch sowieso dafür sorgen, dass alle Deine Strings sauber mit 0 terminiert sind - der strcmp() wird immer ein sauberes Ergebnis bringen. Selbst wenn nicht explizit bei 0 aufgehört wird, ist der Umstand, dass ein String zu Ende ist(0) und der andere nicht (!=0) ein Unterschied, der zu einem Returncode != 0 führt. Ich persönlich sehe strncmp() nur dann als sinnvoll an, wenn mich nur eine bestimmte Anzahl von Bytes interessieren. BTW: Der Code wird für einen Außenstehenden in der Regel leichter lesbar sein, wenn er sich nicht pausenlos fragen muss, aus welchem Grund denn ein Stringvergleich auf x Bytes begrenzt wird, nur um dann festzustellen, dass ja doch implizit der ganze String geprüft wird. Jan P.S.: Ja ich weiss - das ist suse-programming-Thema, aber der Thread hat nun mal hier begonnen.