Rückgabe von 'strcmp'
-
Hallo,
gegeben ist folgendes Bsp:
main(){ char a[20]; char b[20]; strcpy(a,"test"); printf("gebe vergleichswort ein:"); gets(b); printf("strcmp: %i\n",strcmp(a,b)); }
Ich verstehe nicht, wie strcmp genau arbeitet. Woher kommen denn diese unterschiedlichen Rückgabewerte, wenn ich was anderes als test eingebe?
Kann mir jemand dies erklären? Danke!
Toby
-
Das können dir zahlreiche Seiten im Internet erklären. Du brauchst es nur mal bei google eintipen:
http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&c2coff=1&q=strcmp+c&btnG=Google+Suche&meta=lr%3Dlang_de
Wenn du die Suchen funktion dieses Forums benutzt findest du wahrscheinlich auch einige erklärungen.
-
Hi,
ja. google. Hab ich schon, allerding finde ich nur das, was ich schon weiss:
Mit der Funktion strcmp werden die beiden Zeichenketten miteinander verglichen. Sofern "Zeichenkette1" größer ist wird ">0" zurückgegeben, bei Gleichheit "0" und sofern "Zeichenkette2" größer ist wird "<0" zurückgegeben. Da der Vergleich auf Binärebene erfolgt, werden Groß- und Kleinschreibung berücksichtigt.
Alles bis zum letzten Satz ist klar. Was heisst hier aber "auf Binärebene"? Werden hier die einzelnen Binärwerte (was meint es genau?) des ersten Strings addiert und mit dem Ergebnis des zweiten verglichen, oder was ist hier gemeint?
Danke schon mal.
T.PS: Habe schon eben nach "binärebene" gegoogelt...
-
Das meint nur das die Werte verglichen werden und nicht die Buchstaben, was auch klar ist, da ein Buchstabe nur eine abstraktion eines binärwertes ist.
Hast du zum Beispiel ein 'A' und ein 'a' ist das im ASCII Code hinterlegt. so ist zum Beispiel (vorsicht nicht die richtige representation)
'A' = 33
und
'a' = 56dann werden hier die 33 und die 55 verglichen und nicht darauf geachtet das beides ein ah ist.
-
Hallo,
ja, bei einem Zeichenvergleich, wäre es klar. Was ich nicht verstehe ist, wie die ganze Zeichenkette verglichen wird, so das test ungleich tset, weil wenn man so wie Du sagst die ASCII-Werte von den beiden nimmt und addiert, kommt man auf das gleiche Ergebnis, wobei sich hier die zweite und dritte Stelle unterscheiden.
Was ich also nicht verstehe ist, wie die Strings für den Vergleich _auseinandergenommen_ werden, so dass test != tset ist...
Für Euch ist es warscheinlich so trivial, dass Ihr nicht versteht, was ich nicht verstehe, oder? Ist hier mit "Binärvergleich' gemeint, dass der String 'test' auf die entsprechende Abfolge von 0101011001001 auseinandergenommen wird, das gleiche passiert dann mit 'tset' und dass dies verglichen wird, oder was passiert genau mit den Strings bei diesem Vergleich?
Danke
Toby
-
Hier wird nix summiert.
int strcmp(char* a, char* b) { int len_a=strlen(a); int len_b=strlen(b); if(len_a!=len_b) 1; //wenn ungleiche länge, dann können sie nicht identisch sein for(int i=0; i<len_a; ++i) { if(a[i]!=b[i]) //Zeichenweise vergleichen return 1; } return 0; //alles gleich }
Ist es mit dieser Version von strcmp klarer?
-
Hallo Shade Of Mine, hallo Forum,
> Ist es mit dieser Version von strcmp klarer?
ja, bei Deinem Beispiel ist es eindeutig, weil ich hier Zeichen für Zeichen vergleiche und IMMER einen eindeutigen Rückgabewert erhalte, was bei meinem Beispiel nicht der Fall ist und ich immer unhervorsehbares Ergebnis bekomme (warscheinlich, weil ich immer noch nicht verstehe, wie der Stringvergleich bei strcmp() intern funktioniert). Je nach dem, was ich für ein Vergleichstring eintippe, bekomme ich diverse negative, bzw diverse positive Rückgabewerte zurück. Dies verblüffte mich dann also komplett...
Hoffe jetzt konnte ich Euch erklären, wo ich nicht weiter komme und dass jemand mich erlösen kann...
Danke
Toby
-
Der strcmp Code von P.J.Plauger:
int strcmp(const char *s1, const char *s2){ for(;*s1==*s2; ++s1,++s2) if(*s1 == '\0') return (0); return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1); }
Dein Problem liegt ja wohl dabei wenn die strings ungleich sind.
Dann gibt es je nach lexicalischer Reihenfolge -1 oder +1 aus.
Das heißt wenn s1 z.B. im Duden vor s2 steht gibt es -1 zurück.
Wenn s2 vor s1 steht gibt sie 1 zurück;Zumindistens englische Erklärungen habe ich dazu einige im Netz gefunden
Gruß
Entyl Sa
-
Ersetze -1 durch <0 und +1 durch >0
Denn er muss nicht -1/+1 zurückgeben, sondern positive bzw. negative Zahlen.
strcmp ist nämlich normalerweise so geschrieben:
int strcmp(char* a, char* b) { while(*a && *a==*b) { ++a; ++b; } return *a-*b; }
-
Ups. Denkfehler meinerseits...