2 Strings vergleichen!



  • Swordfish schrieb:

    retrogott schrieb:

    *x = pointer oder eine referenz?

    int equal( char const* x, char const* y ) {
        while( *x++ == *y++ ) if ( !*x ) return TRUE;
        return FALSE;
    }
    

    Und wenn der String y länger ist als x? Oder andersherum?



  • Dann ist *x++ == *y++ false



  • kann ich das auch so schreiben ?

    int equal(char x[], char y[]) {
    
       int i = 0;
    
        while(x[i] != '\0' && y[i] != '\0') {
            if(x[i] != y[i]) return 0;
        }
        if(x[i] != y[i]) 
            return 1; 
        return 1;
    }
    


  • Dann kommt bei *x++ == *y++ irgendwann false raus.



  • Hab noch was probiert sollte richtig sein!

    int equal(char x[], char y[]){
    
    int i = 0;
    
        while(x[i] != '\0' && y[i] != '\0') {
            if(x[i] != y[i]) return 0;  /*Keine Gleichheit darum Rückgabewert 0 */
            i++;
        }
       return 1; /*Gleichheit darum Rückgabewert 1*/
    
    }
    


  • SG1 schrieb:

    Dann kommt bei *x++ == *y++ irgendwann false raus.

    Ah stimmt. '\0' != irgendwas nicht '\0' 😃



  • retrogott schrieb:

    Hab noch was probiert sollte richtig sein!

    int equal(char x[], char y[]){
    
    int i = 0;
    
        while(x[i] != '\0' && y[i] != '\0') {
            if(x[i] != y[i]) return 0;  /*Keine Gleichheit darum Rückgabewert 0 */
            i++;
        }
       return 1; /*Gleichheit darum Rückgabewert 1*/
        
    }
    

    Nein, ist immer noch falsch.



  • Bei einer Funktion wie equal würde ich mich an den Returnwerten von strcmp halten:

    • 0 bei Gleichheit
    • ein negativer Wert, wenn x<y oder strlen(x) < strlen(y)
    • sonst ein positiver Wert

    Ich mein ja nur...



  • und weshalb ?! 🙂



  • strcmp = soll ich ja gerade nicht benutzen 🙂
    sonst wär es ja wirklich einfach!



  • Okay, nicht überlegt:

    if(!equal(x,y) // Strings sind gleich!
    


  • Du kannst aber die Funktionalität von strcmp nachprogrammieren.

    Und equal würde ich wörtlich nehmen und bei Ungleichheit 0 zurückgeben.
    Dann geht sowas:

    if(equal("Hallo", "Hallo")) 
      puts("Gleich");
    


  • int equal(char x[], char y[]){
    
    int i = 0;
    
        while(x[i] != '\0' && y[i] != '\0') {
            if(x[i] != y[i]) return 0;  /*Keine Gleichheit darum Rückgabewert 0 */
            i++;
        }
       if(x[i] != y[i]) return 0;  /* das hier hat noch gefehlt, falls x und y ungleich lang sind */
       return 1; /*Gleichheit darum Rückgabewert 1*/
    
    }
    


  • DirkB schrieb:

    Dann ist *x++ == *y++ false

    Nein, nicht wenn bis zur terminierenden 0 bei beim ersten String nur gleiche Zeichen gefunden wurden. Dann ist das Resultat falsch, wenn der 2. String länger als der erste ist. Richtig wird es, wenn der entsprechende Pointer (oder beide) erst nach dem Vergleich auf die 0 erhöht wird.



  • eq schrieb:

    DirkB schrieb:

    Dann ist *x++ == *y++ false

    Nein, nicht wenn bis zur terminierenden 0 bei beim ersten String nur gleiche Zeichen gefunden wurden. Dann ist das Resultat falsch, wenn der 2. String länger als der erste ist. Richtig wird es, wenn der entsprechende Pointer (oder beide) erst nach dem Vergleich auf die 0 erhöht wird.

    Kritisch beim zu frühen Inkrementieren des Pointers ist ausserdem der Vergleich von zwei Strings der Länge 0, da hierbei die terminierende 0 übergangen wird.



  • @eq:

    Hallo erstmal!
    Ich weiß garnicht ob du's wusstest,
    aber du redest schwachfug.



  • Swordfish schrieb:

    @eq:

    Hallo erstmal!
    Ich weiß garnicht ob du's wusstest,
    aber du redest schwachfug.

    Ich weiss zumindest, dass genau die von dir hier gepostete Funktion

    int equal( char const* x, char const* y ) {
        while( *x++ == *y++ ) if ( !*x ) return TRUE;
        return FALSE;
    }
    

    völlig verbuggt ist, was ich, vermutlich im Gegensatz zu dir, durch Testen auch leicht verifizieren konnte.



  • nich streiten, jetz haben wir die frage doch gelöst 😃



  • HobbyCoder85 schrieb:

    nich streiten, jetz haben wir die frage doch gelöst 😃

    Ja, aber die Funktion von Swordfish wäre wegen der Kompaktheit die eleganteste,
    wäre da nicht der Bug.

    @Swordfish
    Deshalb nochmal zum Üben:

    #include <stdio.h>
    
    #define FALSE 0
    #define TRUE  1
    
    #define SWORDFISH 1 /* 1=verbuggt, 0=O.K. */
    
    int equal( char const* x, char const* y ) {
    #if SWORDFISH /* verbuggt */
        while( *x++ == *y++ ) if ( !*x ) return TRUE;
        return FALSE;
    #else /* O.K. */
        while( *x == *y ) {
           if ( !*x ) return TRUE;
           x++;
           y++;
        }
        return FALSE;
    #endif
    }
    
    int main() {
        char const* x = "ABC";
        char const* y = "ABCD";
    
        printf( "\nequal( x, y ) mit x=\"%s\" und y=\"%s\" --> ", x, y );
        if ( equal( x, y ) ) printf( "GLEICH\n" );
        else                 printf( "VERSCHIEDEN\n" );
    
        printf( "\nequal( y, x ) mit y=\"%s\" und x=\"%s\" --> ", y, x );
        if ( equal( y, x ) ) printf( "GLEICH\n" );
        else                 printf( "VERSCHIEDEN\n" );
    
        return 0;
    }
    


  • Ohne es jetzt zu testen, würde es nicht genügen, ind Swordfishs Version das Inkrement für x zu verlagern:

    while( *x == *y++ ) if ( !*x++ ) return TRUE;
    return FALSE;
    

Anmelden zum Antworten