6

文字を単純にシフトする関数を作成しようとしました (次の関数の shift パラメータに応じて、左または右に)。大文字は大文字のままです。これが私のアプローチです:

char encodeCaesarCipherChar(char ch, int shift)
{
    char result;
    if (!isalpha(ch)) return ch;

    result = ch + shift;

    if (islower(ch) && result < 'a') {
        result += int('z') - 1;
        result -= int('a');
    } else if (islower(ch) && result > 'z') {
        result -= int('z');
        result += int('a') - 1;
    }  else if (isupper(ch) && result < 'A') {
        result += int('Z') - 1;
        result -= int('A');
    }  else if (isupper(ch) && result > 'Z') {
        result -= int('Z');
        result += int('A') - 1;
    }

    return result;
}

入力文字が「s」以降の場合、この機能は正常に動作しなくなります。誰かが私のアプローチの問題を指摘してもらえますか?

前もって感謝します。

4

1 に答える 1

6

's' + 13 は符号付き をオーバーフローしcharます。結果を に保持し、数値を調整した後、返す前にintキャストします。char

于 2013-09-14T09:47:42.030 に答える