Warum strcmp() gibt 0 zurück, wenn die Eingaben gleich sind?
Wenn ich einen Anruf auf der C-string-compare-Funktion, wie diese:
strcmp("time","time")
Es gibt 0 zurück, was bedeutet, dass die strings nicht gleich sind.
Kann mir jemand sagen, warum C-Implementierungen scheinen, dies zu tun? Ich würde denken, würde es wieder ein Wert ungleich null, wenn Sie gleich sind. Ich bin neugierig, die Gründe sehe ich dieses Verhalten.
Zeit != Geld direkt, müssen Sie beschäftigen eine Einheit-Konvertierung als Erster.
ein dickes Lob an alle, überarbeitet diese spam-Frage in etwas möglicherweise nützlich für Neulinge. Ich bin noch nicht bereit, für ihn zu Stimmen, obwohl, damit Sie nicht ermutigen, die OP zu post solche Kutteln wieder.
Danke, aber beleidigen Sie nicht die OP.
Ich kann Fragen, wie viele dumme Witz Fragen, wie ich möchte. Interessenten, die ursprüngliche Frage war: "Warum strcmp("Zeit","Geld") gibt 0 zurück, statt der nicht-null?".
edit: nicht zurück-null anstelle von 0.
ein dickes Lob an alle, überarbeitet diese spam-Frage in etwas möglicherweise nützlich für Neulinge. Ich bin noch nicht bereit, für ihn zu Stimmen, obwohl, damit Sie nicht ermutigen, die OP zu post solche Kutteln wieder.
Danke, aber beleidigen Sie nicht die OP.
Ich kann Fragen, wie viele dumme Witz Fragen, wie ich möchte. Interessenten, die ursprüngliche Frage war: "Warum strcmp("Zeit","Geld") gibt 0 zurück, statt der nicht-null?".
edit: nicht zurück-null anstelle von 0.
InformationsquelleAutor Xenu | 2009-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
strcmp liefert einen lexikalischen Unterschied (oder sollte ich nenne es "short-circuit serial byte Vergleicher" ? 🙂 ) der beiden strings, die als Parameter angegeben.
0 bedeutet, dass beide strings gleich sind
Ein positiver Wert bedeutet, dass die s1 wäre nach s2 in einem Wörterbuch.
Ein negativer Wert bedeutet, dass die s1 würde, bevor s2 in einem Wörterbuch.
Damit Ihre nicht-null-Wert beim Vergleich von "Zeit" und "Geld" die sind natürlich unterschiedlich, auch wenn man sagen würde, dass Zeit Geld ist ! 🙂
Ich könnte schwören, dass ich gelesen habe, docs, sagte strcmp() führt einen lexikalischen Vergleich, aber einige schnelle googeln legt nahe Ferruccio richtig ist... könnte es sich geändert haben?
NÖ. Immer so 🙂
Hmmm ich bin mir ziemlich sicher, dass es einen lexikalischen Vergleich ! cplusplus.com/reference/clibrary/cstring/strcmp.html
Ich denke, es ändert sich mit der gegebenen definition von "lexikalisches". Ich habe auch gesehen, strcmp() bezeichnet als 'lexikalische' Komparator, obwohl es natürlich nicht nehmen, andere Lokalisationen, Sortierungen, etc.. berücksichtigt. Vielleicht ist es besser, nennen es eine "short-circuit serial byte Vergleicher."
InformationsquelleAutor Benoît
Die nette Sache über eine Umsetzung wie diese ist Sie sagen können,
Beachten Sie, wie der Vergleich mit der 0 stimmt genau mit dem Vergleich in der Implikation.
#define StrTest(str1, op, str2) (strcmp(str1, str2) op 0)
Mit ihm, würden Sie schreibenif(StrTest(stringA, ==, stringB))
und Freunde. Ich bin auf dem Zaun, ob es eine schreckliche Idee oder eine wunderbare Idee.InformationsquelleAutor Daniel LeCheminant
Ist es üblich, Funktionen für die Rückgabe von null für die gemeinsame - oder one-of-a-Kind - case-und nicht-null für spezielle Fälle. Nehmen Sie die main-Funktion, die konventionell gibt null zurück bei Erfolg, und einige nicht-null-Wert für das scheitern. Der genaue Wert ungleich null zeigt an, was schief gelaufen ist. Zum Beispiel: out of memory, keine Zugriffsrechte oder etwas anderes.
In deinem Fall, wenn der string gleich ist, dann gibt es keinen Grund warum ist es gleich, außer dass die strings enthalten die gleichen Zeichen. Aber, wenn Sie sind nicht gleich, dann wird entweder die erste kann kleiner sein, oder der zweite kleinere. Nachdem er 1 zurück gleich 0 für kleinere und 2 größere wäre irgendwie seltsam, finde ich.
Können Sie auch darüber nachdenken, es in Bezug auf die Subtraktion:
Wenn s1 "lexikographisch" weniger, dann wird es geben ein negativer Wert.
ich meinte es sinnbildlich war pseudo-code.
Ah. Ich ziehe den Vorschlag zurück.
InformationsquelleAutor Johannes Schaub - litb
Einem anderen Grund
strcmp()
gibt die codes, die es tut, ist, so dass es kann verwendet werden, direkt in den standard-library-Funktionqsort()
, so dass Sie zu Sortieren ein array von strings:Diesem kleinen Beispielprogramm sortiert seine Argumente ASCIIbetically (was einige nennen würde, lexikalisch). Lookie:
Wenn
strcmp()
zurückgegeben1
(true) für gleiche strings und0
(false) für inequal lieben, es wäre unmöglich, zu verwenden, um die Grad oder Richtung Ungleichheit (d.h. wie die anderen, und die ist größer) zwischen den beiden Saiten, so dass es unmöglich ist, es zu benutzen als Sortier-Funktion.Ich weiß nicht, wie vertraut Sie mit C. Der obige code verwendet einige C ' s die meisten verwirrend Konzepte - Zeigerarithmetik, Zeiger-Neufassung, - und Funktionszeiger - also, wenn Sie nicht verstehen, einige der code, Mach dir keine sorgen, du wirst es bekommen in der Zeit. Bis dahin werden Sie haben viel Spaß Fragen auf StackOverflow. 😉
InformationsquelleAutor Chris Lutz
Scheinen Sie zu wollen
strcmp
arbeiten wie eine (hypothetische)Sicher zu sein, dass wäre wahr, um die "zero false" interpretation der Ganzzahl-Ergebnisse, aber es erschweren würde die Logik der Sortierung, weil, nachdem festgestellt wurde, dass die beiden Saiten waren nicht die gleichen, Sie würde noch lernen müssen, die kam "früher".
Außerdem vermute ich, dass eine gemeinsame Umsetzung aussieht
ist [edit: kinda] elegant in einem K&R Art und Weise. Der wichtige Punkt hier (das ist immer verdeckt, indem man den code nach rechts (offenbar sollte ich Links gut genug allein) ist der Weg der return-Anweisung:
welche gibt die Ergebnisse des Vergleichs natürlich in Bezug auf die Charakter-Werte.
ich denke, u gotta beenden Sie die Schleife, wenn Sie kommen, um \0 🙂 u auch zu beobachten, über unter-in *s1 - *s2, also s1=-127, s2=2 => oops 🙂
Uh. Ja. Moment, während ich dies beheben...
oh wait. Nein wird nicht dazu führen, einen Unterlauf, weil beide zuerst in eine int.
Warum nicht einfach && *s1? :]
InformationsquelleAutor dmckee
Gibt es drei mögliche Ergebnisse: string 1 kommt vor dem string 2 string 1 kommt nach string 2 string 1 ist gleich string 2 ist. Es ist wichtig, dass diese drei Ergebnisse getrennt; eine Verwendung von strcmp() wird zum Sortieren von Zeichenfolgen. Die Frage ist, wie wollen Sie Werte zuweisen, die für diese drei Ergebnisse, und wie die Dinge mehr oder weniger konstant. Sie könnten auch einen Blick auf die Parameter, die für qsort() und bsearch(), die erfordern, vergleichen Sie funktioniert ähnlich wie strcmp().
Wenn Sie wollte einen string-Gleichheit-Funktion, würde es wieder einen Wert ungleich null für gleiche strings und null für nicht-gleich-strings, zu gehen zusammen mit den C-Regeln auf true und false. Dies bedeutet, dass es keine Möglichkeit gäbe, zu unterscheiden, ob string-1 kam vor oder nach dem string 2. Es gibt mehrere wahre Werte für ein int, oder eine beliebige andere C-Datentyp, den Sie benennen, sondern nur eine falsche.
Daher, mit einer nützlichen strcmp (), die true zurück für string-Gleichheit erfordern würde eine Menge änderungen an den rest der Sprache, das einfach nicht passieren.
InformationsquelleAutor David Thornley
Ich denke, es ist einfach für Symmetrie: -1 bei kleiner, 0 wenn gleich, 1 wenn mehr.
InformationsquelleAutor PhiLho