lexikographischer "<"-Vergleich
-
strcmp macht diesen Vergleich bereits und strcoll sogar (bei richtig gesetzter deutscher Sprachumgebung) für deutsche Umlaute.
-
hey,
danke erstmal. ich hab mal was versucht:#include <stdio.h> #include <string.h> int less(char *s1, char *s2) { if (s1 > s2) return 1; else if (s1 == s2) return 0; else return -1; } int main() { char s1[] = "aaaa"; char s2[] = "bbbb"; less(s1,s2); printf("Vergleich: %d ", less(s1,s2)); return 0; getchar(); }
wieso kommt nicht -1 raus? s1="aaaa" ist doch kleiner als s2="bbbb"
-
Nun, vertausche mal die Reihenfolge der Arrays. Nun sollte es stimmen.
Das liegt daran, dass du mit s1 < s2 die Adresse im Speicher vergleichst.
Du brauchst eine Schleife, die jedes Zeichen anguckt und darauf mit < vergleicht.
-
hey danke für die antwort!
stimmt es so?
#include <stdio.h> #include <string.h> int less(char *s1, char *s2) { int i=0; while(s1[i] != '\0' && s2[i] != '\0') { if (s1[i] > s2[i]) return 1; else if (s1[i] == s2[i]) return 0; else return -1; i++; } } int main() { char s1[] = "aaaa"; char s2[] = "bbbb"; less(s1,s2); printf("Vergleich: %d ", less(s1,s2)); return 0; getchar(); }
-
Abgesehen davon, dass das getchar() vors return sollte, ja.
-
danke
-
CCCstringcast schrieb:
int less(char *s1, char *s2) { int i=0; while(s1[i] != '\0' && s2[i] != '\0') { if (s1[i] > s2[i]) return 1; else if (s1[i] == s2[i]) return 0; else return -1; i++; } }
Hast Du Deinen Code denn auch mal ausprobiert? Möglichst sogar mit den verschiedenen Fällen?
-
Oh, stimmt ja.
-
hey danke. ja habe ich und es hat frunktioniert. also immer -1, 0 bzw 1 bei dem jeweiligen fall ausgegeben.
-
Teste es mal mit "azzz" und "baaa".
-
CCCstringcast schrieb:
hey danke. ja habe ich und es hat frunktioniert. also immer -1, 0 bzw 1 bei dem jeweiligen fall ausgegeben.
Dann hast Du Deine Tests nicht ordentlich ausgewählt. Zugegeben, das ist auch eine Kunst für sich, aber bei einfachen Funktionen keine Raketentechnik.
Z.B. hab ich hier ein paar Testdurchläufe für Deine Funktion, die nicht alle funktionieren.struct test_data{ const char *a; const char *b; int result; } test_data[]={ { "a", "b", -1 }, { "a", "a", 0 }, { "a", "", 1 }, { "", "", 0 }, { "aa", "ab", -1 }, { "aa", "aa", 0 }, { "aaa", "aa", 1 } }; void test(const char *a, const char *b, int expected){ int result = less(a, b); if(result == expected) printf("less(\"%s\", \"%s\") == %i passed!\n", a, b, result); else printf("less(\"%s\", \"%s\") == %i failed! (expected: %i)\n", a, b, result, expected); } int main(void){ const int N = sizeof(test_data) / sizeof(*test_data); for(struct test_data *t=test_data; t!=test_data+N; ++t){ test(t->a, t->b, t->result); test(t->b, t->a, -t->result); } }
Darüberhinaus: schau noch, ob Du Warnungen bei Deinem Compiler einstellen kannst. Z.B.
-Wall -pedantic
beim gcc.