2017-01-08 10 views
0

関数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、なぜですか?

+0

をあなたが各呼び出しの前にcompare' 'に' return'を配置する必要があり、そうでない場合再帰的に 'compare'を呼び出しますが、その関数の実行を続けます。 –

+0

''関数を 'char'値と組み合わせて使用​​すると、' char'値が負のときは未定義の動作になります。 ' 'のいずれかの関数に' char'値を渡す前に 'char'値を' unsigned char'にキャストする必要があります。 –

+0

@ JohnnyMoppに言及したことに加えて、関数の最後に 'return'ステートメントがありません。' return'ステートメントなしで 'void'とは異なるものを返す関数の終わりから落ちます。 –

答えて

1

returnの文のほかに、あなたのロジックに欠陥があります。あなたは両方の文字列は、以前の機能では空であり、したがって、等しいかどうかを確認する必要があります。

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); 
} 

あなたがここでそれを確認することができます。https://ideone.com/Si78Nz

+0

ああ、私の愚かなこと。わかりました!ありがとうございました! – Alexander

関連する問題