2016-04-01 12 views
4

これは簡単なコードですが、私は奇妙な出来事を理解できません。 コード: It works奇妙なcharの暗号化(ascii)

void Crittografia::CifraTesto(char text[]){ 
    int i; 
    for (i=0;i<strlen(text);i++){ 
     text[i]=text[i] + key; 
     if(text[i] > 'z'){ 
      text[i]=text[i] - 26; 
     } 
    } 
} 

機能は、ここで入力した文字列を受け取ります。
この場合、キー5で動作します。 'y'が 'd'で正しく変更されました。

ただし、この場合:Doesn't workです。
キーが7の場合、正しい 'f'の代わりに 'Ç'の 'y'が変更されるため、「text [i] = text [i] - 26;」という行は明らかに実行されません。

+0

あなたは、コンソールウィンドウからテキストをコピーする方法を学ぶ必要があります。 Windowsオペレーティングシステムでは、タイトルバーを右クリックし、「編集」 - >「マーク」を選択します。マウスを使用して、コピーする領域を強調表示し、Enterを押します。強調表示されたテキストがクリップボードに配置され、質問に貼り付けることができます。 –

+1

[ASCIIテーブルリファレンス](http://en.cppreference.com/w/c/language/ascii)が良いスタートになるかもしれません。その理由を知ることができます。 'someCharacteer - 26'はあまりいい考えではないかもしれません。 –

+0

Cに '::'はありませんので、あなたの質問は 'C'でもありません。 –

答えて

2

です。あなたは不平等の両側からkeyを減算することによってそれを避けることができます。

for (int i=0; text[i]; i++) { 
    if (text[i] > 'z' - key) // check whether (text[i] + key) would be past `z` 
     text[i] -= 26 - key; 
    else 
     text[i] += key; 
} 
4

text [i] = text [i] + key;キーは7とtext[i]charに収まらない'y'加算結果である場合には

(あなたの文字が署名されているようだ)、その結果は実装定義されています。

追加ではモジュロ演算子を使用する方がよいでしょう。例えば

text[i]= (text[i] - 'a' + key) % 26 + 'a'; 
2

あなたはモジュラスオペレータ、 '%' を使用する必要があります。
検索StackOverflow "C++ caesar cipher"この割り当ての詳細については、

例:ジョルジが言ったように、あなたの問題はオーバーフローで

new_letter = (old_letter - 'a'); // Set the range from 0 to 25. 
new_letter = (new_letter + key) % 26; // 26 letters in the alphabet. 
new_letter += 'a'; // Convert back to a letter. 
+0

モジュラスは有用ですが、必須ではありません。加えて、 '%'を使わずにモジュラスを計算することができます。 –

+0

@BenVoigtしかし、私たちはすべてモジュラスを使用し、OPはほかの人のコードでそれを見ています。 – nicomp