0

こんにちは、暗号化された文字列を取り、すべてのキーで解読するこの Caesar cipher decrytor に取り組んでいます (別のメッセージに似ている場合は、別の関数がそれらを照合します)。私はDecipher関数を持っていますが、関数を書くことができる他の方法があるかどうか疑問に思っていました. どんなアイデアでも大歓迎です。ありがとう!

void Decipher(char cip[], char key){

for(int i = 0; cip[i] != '\0'; i++){
  if(cip[i] == ' '){
      cip[i]= cip[i];

  }else if(int(cip[i] >= int(key){
      cip[i] = char(int(cip[i]) - ((int(key) - 65) % 26));

  }else{
        cip[i] = char(26 + int(cip[i]) - ((int(key)-65) % 26);
  }

 }

}
4

2 に答える 2

1

常に別の方法があります。通常、さらに半ダースの方法があります。まず、適切な復号化を行う部分を単独で関数に移動します。

char decipher(char in, char key) { 
    // ..
    return in;
}

次に、コードの共通点の量を考慮して、繰り返しの少なくとも一部を削除しようとします。

char decipher(char in, char key) {
    if (in != ' ') {
        in = char(in - ((key - 'A') % 26));
        if (in < 0) 
            in += 26;
    }
    return in;
}

これで、文字列をステップ実行して各要素を解読する外部ルーチンが残ります。私はおそらくそのために標準アルゴリズムを使用しstd::string、パラメータとして an への参照を使用します):

void decipher(std::string &s, char key) { 
    std::transform(s.begin(), s.end(), s.begin(), 
        [key](char c) { return decipher(c, key); });
}

forまたは、代わりに範囲ベースのループを使用できますtransform

for (auto &c : s) 
     c = decipher(c, key);
于 2015-09-24T01:11:34.520 に答える
0

適切な C++(11) が必要な場合は...

void Decipher(std::string& cip, unsigned char key) {
    for (auto&& c : cip) {
        if (c == ' ')
            continue;
        if (((unsigned char)c) >= key)
            c = (char)(((int)c) - (((int)key) - 'A') % 26);
        else
            c = (char)(26 + ((int)c) - ((((int)key) - 'A') % 26));
    }
}

これは文字列を参照として受け取り、文字列の変更が元の文字列に影響を与えるようにするために、範囲ベースの for ループを使用して文字列内の文字を反復し、右辺値参照を取得します。

回転計算の実行方法に変更を加えていないのは、それがC++ 風であることに関連するものではないからです。

于 2015-09-24T01:17:18.717 に答える