2017-02-12 4 views
1

私はC++でCeasar暗号のための小さなプログラムを書いています。 私は論理をうまくやっていると思います。しかし、私が理解できないいくつかの奇妙な理由のため、ASCIIの追加は間違っています。ここに私のコードです: この行で何かが間違っています: "s [i] =(abs(s [i]))+ k;"asciiで絶対値が正しく追加されない

次のように私は入力を与えています:

XY

出力は次のようになります。ED: GH

は私がように、出力を取得しています。

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

int main(){ 
    int n; 
    cin >> n; 
    string s; 
    cin >> s; 
    int k; 
    cin >> k; 
    k = k % 26; 
    for(int i = 0; i<s.size(); i++){ 
     if((abs(s[i]) >=65 && abs(s[i]) <=90) || (abs(s[i]) >= 97 && abs(s[i]) <= 122)){ 
      cout << "k is: "<<k << endl; //k should be 9 
      //for x abs(s[i]) should be 120 
      cout << "Absolute value is: "<<abs(s[i]) <<endl; 

      s[i] = (abs(s[i])) + k; // thish is not 129.. i am getting 127 
      cout << "After adding K: "<<abs(s[i]) << endl; 
      if((abs(s[i]) > 90) && (abs(s[i]) < 97)) 
       s[i] = abs(s[i]) - 26; 
      if(abs(s[i]) > 122){ 
       s[i] = abs(s[i]) - 26; 
      }        
     } 
    } 
    for(int i =0 ; i< s.size(); i++) 
     cout<<s[i]; 
    return 0; 
} 

助けてください。ありがとう。

+0

文字列は符号付き文字で作られていますか?だから129は無事だ。 –

+0

ああ、私はそれを逃した。私たちがこの問題を解決できる迅速な方法はありますか? – hshantanu

+0

私の答えを確認してください:) –

答えて

2

このライン:

s[i] = (abs(s[i])) + k; 

より高い127文字列が内部charタイプを使用するので、あなたはs[i]に範囲外の値を入れている値を計算します:実装が定義されて:モジュロ、truncature ...

サブサイクリング26は後で助けになりません。データはすでに破棄されています。

修正:整数との仕事のすべての方法、そして最後に戻っs[i]に割り当てるには:

for(int i = 0; i<s.size(); i++){ 
    int v = s[i]; 
    if((abs(v) >=65 && abs(v) <=90) || (abs(v) >= 97 && abs(v) <= 122)){ 
     cout << "k is: "<<k << endl; //k should be 9 
     //for x abs(v) should be 120 
     cout << "Absolute value is: "<<abs(v) <<endl; 

     v = (abs(v)) + k; // integer won't overflow 
     cout << "After adding K: "<<abs(v) << endl; 
     if((abs(v) > 90) && (abs(v) < 97)) 
      s[i] = abs(v) - 26; 
     if(abs(v) > 122){ 
      s[i] = abs(v) - 26; 
     }        
    } 
} 

私はそれをテストしていると私はghすべての権利を取得(及びより少ない配列アクセスがありますので、それは高速です〜s[i]

+0

ありがとうございました! – hshantanu

関連する問題