2017-01-08 2 views
0

Die Funktion int vergleichen (...), prüft, ob 2 Strings gleich sind ignorieren Fall und alle nicht-alphabetischen Zeichen, z. "a? ...! b" entspricht "ab". Gibt 1 wenn gleich, 0 sonst zurück. Es gibt jedoch einen Fehler in meinem Code!Rekursiver Vergleich zweier Strings

int compare(const char* string1, const char* string2) 
{ 
    if(string1 == NULL || string2 == NULL) 
    return 0; 

    std::cout << *string1 << " | " << *string2 << std::endl; 
    if((!isalpha(*string1) && *string1 != ' ') && (!isalpha(*string2) && *string2 != ' ')) 
    { 
     compare(++string1,++string2); 
    } 
    else if(!isalpha(*string1) && *string1 != ' ') 
    { 
     compare(++string1,string2); 
    } 
    else if(!isalpha(*string2) && *string2 != ' ') 
    { 
    compare(string1, ++string2); 
    } 

    if(tolower(*string1) != tolower(*string2)) 
    return 0; 
    if(*string1 == '\0') 
    return 1; 
    if(*string1 == *string2) 
    compare(++string1, ++string2); 
} 

Wenn ich versuche, und diesen Code ausführen mit zum Beispiel:

compare("a !!!b", "a b"); 

Der Ausgang verwirrt mich wirklich:

a | b 
    | 
! | 
! | 
! | 
b | b 
^@| ^@ 
    | a 
^@| ^@ 
    | a 

Es gibt 0 (nicht gleich). Es hört nicht auf zu laufen, sobald es b | erreicht b, warum?

+0

Sie müssen 'return' zu' compare' vor jedem Anruf setzen, sonst Es ruft rekursiv 'compare' auf, führt dann aber die Ausführung der Funktion fort. –

+0

Beachten Sie, dass die Verwendung von '' Funktionen mit 'char' Werten zu undefiniertem Verhalten führt, wenn die' char' Werte negativ sind! Sie sollten die "char" -Werte in "unsigned char" umwandeln, bevor Sie sie an eine der Funktionen von '' übergeben. –

+0

Zusätzlich zu dem, was @JohnnyMopp erwähnt: Es gibt keine 'return' -Anweisung am Ende der Funktion: das Abfallen vom Ende einer Funktion, die etwas anderes als' void' zurückgibt, ohne eine 'return'-Anweisung, ist undefiniertes Verhalten. –

Antwort

1

Abgesehen von der return Anweisung haben Sie einen Fehler in Ihrer Logik. Sie müssen überprüfen, ob beide Strings leer und somit gleich früher in der Funktion sind:

int compare(const char* string1, const char* string2) 
{ 
    if(string1 == NULL || string2 == NULL) 
     return 0; 

    // This needs to go here 
    if(*string1 == '\0' && *string2 == '\0') { 
     return 1; 
    } 

    std::cout << *string1 << " | " << *string2 << std::endl; 
    if((!isalpha(*string1) && *string1 != ' ') && (!isalpha(*string2) && *string2 != ' ')) 
    { 
     return compare(++string1,++string2); 
    } 
    else if(!isalpha(*string1) && *string1 != ' ') 
    { 
     return compare(++string1,string2); 
    } 
    else if(!isalpha(*string2) && *string2 != ' ') 
    { 
     return compare(string1, ++string2); 
    } 

    if(tolower(*string1) != tolower(*string2)) 
     return 0; 
    if(*string1 == *string2) 
     return compare(++string1, ++string2); 
} 

Sie können es hier ansehen: https://ideone.com/Si78Nz

+0

Oh, wie dumm von mir. Jetzt sehe ich! Vielen Dank! – Alexander