2017-09-19 15 views
0

文字列が回文かどうかをチェックする関数を書いています。例: aba、abba、ba、ba、マグロの瓶のナッツ。 アバはパリンドロームではなく、 ""(奇数スペース)と ""(ダブルスペース)はありません。ispalindrome C、空白チェックの問題

int is_palindrome(const char string[]) { 

    // This implementation is only partly correct 
    int string_length = length(string); 
    int i = 0, j = string_length - 1; 
    for (i = 0; i < j + 1; i++, j--) { 
    while (string[i] == ' ') { 
     i = i + 1; 
    } 
    while (string[j] == ' ') { 
     j = j - 1; 
    } 
    if (string[i] == ' ' && string[j] == ' ') { 
     break; 
    } 

    if (string[i] != string[j]) { 
     return 0; 
    } 
    } 
    return 1; 
} 

しかし、私の本当の問題は、この機能はoddspaceとスペースのどちらかを確認することができないということである、と私は間違っどこで見ることができません。

+1

デバッガを使用すると、問題を発見しやすくなります。特にこの問題は、シングルステッピングがどこから離れていくのかを発見することで完璧なものになります。 – WhozCraig

+0

部分的に間違っている場合は間違っています –

+0

'string [i]'と 'string [j]'の*文字*を実際に比較する場所も表示されません。あなたは 'i'と' j'を見つけるために多くの仕事をしました。これらの努力をあなたが知っている唯一の条件と比較することは、あなたのループを破った条件が非生産的であるため、真実ではありません。 – WhozCraig

答えて

0

いくつかの問題があります。まず、string[i] == ' 'string[j] == ' 'のテストは無意味です。前の行はスペースではないことを保証しています。もしそうであれば、あなたはそれらをスキップしたでしょう。

また、jを減らす方法にも問題があります。文字列の先頭から実行されていないことを確認することは決してありません。私はそれを扱う最も簡単な方法は、私が過去のjをインクリメントすることを許さず、jが過去のiを減らすことを許さないことだと思います。

私は奇妙な空間と二重空間が回文意味ではないことを理解していません。あなたは回文のスペースを無視します(そうでなければ「マグロの瓶のナッツ」は1つではありません)。それが回文であると判断されるために少なくとも1つの非空白文字がなければならないのでしょうか?私はブール値を追加してfor()ループの一番下に設定して、少なくとも1つの空白以外の文字があることを示し、そのブール値に基づいて最終的な戻り値を設定します。

+0

ありがとうございます、あなたの最初の点は私には大変意味があります。私はちょうどiループの間に関数を追加した後、i-1 == jかどうかをチェックします。もしそうなら、すべての文字はスペースなので回文ではありません。 –