2017-02-12 6 views
1

C++의 Ceasar 암호 용 작은 프로그램을 작성했습니다. 나는 논리로 잘하고 있다고 생각한다. 그러나, 내가 이해할 수없는 몇 가지 이상한 이유 때문에 ASCII 추가가 잘못 될 수 있습니다. 여기 내 코드가 있습니다 : 이 줄에 뭔가 잘못되었습니다 : "s [i] = (abs (s [i])) + k;" 다음과 같이절대 값이 ascii에서 올바르게 추가되지 않음

I 입력을 제공하고있다 :

87

출력 될해야

2

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는 no-go이다. –

+0

오, 나는 그것을 놓쳤다. 우리가이 문제를 해결할 수있는 빠른 방법은 무엇입니까? – hshantanu

+0

내 대답 확인 :) –

답변

2

이 라인 : 구현 정의 :

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

당신이 s[i]에서 범위를 벗어난 값을 옮기고 있도록보다 높은 127 문자열은 내부적으로 char 유형을 사용하는 값을 계산 모듈, 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