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?
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. –
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. –
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. –