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.


Anmelden zum Antworten