2017-02-12 7 views
1

Я написал небольшую программу для Ceasar cipher в C++. Я думаю, что я хорошо разбираюсь в логике. Однако добавление ASCII идет не так по какой-то нечетной причине, которую я не могу понять. Вот мой код: Что-то не так в этой строке: "s [i] = (abs (s [i])) + k;"Абсолютное значение не добавляется правильно в ascii

Я даю вход следующим образом:

ху

Выход Должно быть: Г.Х.

Я получаю результат, как: Под ред.

#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 впоследствии не помогает: данные уже уничтожены.

Fix: работа с целыми весь путь, и присвоить обратно к 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

 Смежные вопросы

  • Нет связанных вопросов^_^