Frage zu strcmp()
-
Hallo,
in meinem Buch steht strcmp() wie folgt:
int strcmp(char str1[], char str2[])
{
int i
for( i=0; str1[i] == str2[i]; ++i)
if(str1[i] == '\0') break;return( str1[i] - str2[i]);
}Frage:
Wieso liefert die Funktion einen int Wert, str[i] ist doch ne ne Hex-Zahl, oder is das ne dezimal ASCII-Zahl? Aber selbst dann: <if(str1[i] == '\0') break;> setzt voraus, dass str2 länger als str1 ist ?
Und <str1[i] - str2[i]> ist dann vollkommen abhängig von den Buchstaben/Inhalt?Bitte klärt mich auf
MfG
-
jizzer schrieb:
str[i] ist doch ne ne Hex-Zahl, oder is das ne dezimal ASCII-Zahl?
str[i] ist ein char. Also ein Buchstabe, der intern durch eine (meist ASCII-)Zahl dargestellt wird. Hex- oder Dezimal ist eine Sache der Ausgabe, also an dieser Stelle absolut nicht relevant.
Aber selbst dann: <if(str1[i] == '\0') break;> setzt voraus, dass str2 länger als str1 ist ?
Schau Dir mal die Schleifenbedingung an: str1[i] kann (innerhalb der Schleife) nur dann '\0' sein, wenn str2[i] das auch ist.
Und <str1[i] - str2[i]> ist dann vollkommen abhängig von den Buchstaben/Inhalt?
Häh? Wovon soll es denn sonst abhängig sein als von str1[i] und str2[i]?
-
Und <str1[i] - str2[i]> ist dann vollkommen abhängig von den Buchstaben/Inhalt?
Häh? Wovon soll es denn sonst abhängig sein als von str1[i] und str2[i]?
Ich dachte strcmp gibt eine Aussage über die Längerelation der beiden Strings, nicht über das Zeichenverhältnis an der ersten ungleichen Stelle (was bringt diese Information?). Daher das Misverständnis.
danke
-
jizzer schrieb:
(was bringt diese Information?).
Du kannst damit Worte sortieren.
-
Hättest du ein Beispiel dafür?
mfG
-
jizzer schrieb:
Hättest du ein Beispiel dafür?
mfG
void view_array ( char** a, unsigned n ) { unsigned i; for ( i = 0; i<n; i++ ) puts(a[i]); } #define PPCHARSIZE(x) (sizeof(x)/sizeof(char*)) int main() { char* a[2] = {"wort_z", "wort_a"}; char* temp; puts("Unsorted: "); view_array( a, PPCHARSIZE(a) ); if ( strcmp( a[0], a[1] ) > 0 ) { temp = a[0]; a[0] = a[1]; a[1] = temp; } puts("Sorted: "); view_array( a, PPCHARSIZE(a) ); getchar(); return 0; }
-
lieber so:
#define PPCHARSIZE(x) (sizeof (x) / sizeof *(x))
-
Ich fühle mich doch dazu verpflichtet, qsort hier wenigstens zu erwähnen:
#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a)) void view_array(char const *words[], size_t n) { size_t i; for(i = 0; i < n; ++i) { puts(words[i]); } } int strcmp_ref(void const *p1, void const *p2) { return strcmp(*((char const *const*)p1), *((char const *const*)p2)); } int main() { char const *words[] = { "foo", "baz", "qux", "bar", "quux" }; puts("Unsortiert:"); view_array(words, ARRAY_SIZE(words)); qsort(words, ARRAY_SIZE(words), sizeof(char const*), strcmp_ref); puts("Sortiert:"); view_array(words, ARRAY_SIZE(words)); return 0; }
Allgemein gesprochen definiert strcmp eine totale Ordnung über Strings, die im basic execution character set kodiert sind (üblicherweise ASCII oder eine der ISO8859-Varianten). Das ist überall da von Interesse, wo du eine solche Ordnung brauchst, also die Frage stellst: "Ist String 1 'kleiner' als String 2"?
Sortieren ist eine Anwendung, binäre Bäume sind eine andere, Priority Queues eine dritte. Es gibt ziemlich viele davon.
Und ganz am Rande: jedes mal, wenn jemand ein String-Literal einem char* zuweist, stirbt ein süßes Kätzchen auf grausame Weise. Das heißt: Big Brother 5, süße Kätzchen: 0. :p
-
supertux schrieb:
lieber so:
#define PPCHARSIZE(x) (sizeof (x) / sizeof *(x))
Jepp, das macht das Makro flexibler.
seldon schrieb:
Und ganz am Rande: jedes mal, wenn jemand ein String-Literal einem char* zuweist, stirbt ein süßes Kätzchen auf grausame Weise. Das heißt: Big Brother 5, süße Kätzchen: 0. :p