関数int compare(...)は、2つの文字列がと等しく、の大文字と小文字を区別しないかどうかをチェックします。 "a?...!b"は "ab"に相当します。等しい場合は1、それ以外の場合は0を返します。しかし、私のコードにバグがあります!2つの文字列の再帰的比較
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);
}
私がしようとすると、たとえばでこのコードを実行する場合:
compare("a !!!b", "a b");
出力は、本当に私を混乱させる:
a | b
|
! |
! |
! |
b | b
^@| ^@
| a
^@| ^@
| a
それは0(等しくない)を返します。それは一度それになると実行を停止しませんb | b、なぜですか?
をあなたが各呼び出しの前にcompare' 'に' return'を配置する必要があり、そうでない場合再帰的に 'compare'を呼び出しますが、その関数の実行を続けます。 –
''関数を 'char'値と組み合わせて使用すると、' char'値が負のときは未定義の動作になります。 ' 'のいずれかの関数に' char'値を渡す前に 'char'値を' unsigned char'にキャストする必要があります。 –
@ JohnnyMoppに言及したことに加えて、関数の最後に 'return'ステートメントがありません。' return'ステートメントなしで 'void'とは異なるものを返す関数の終わりから落ちます。 –