2016-03-12 4 views
1

Итак, я сейчас делаю программу шифрования цезаря, используя коды ASCII для алфавита, где исходный текст сдвигает 6 символов вправо, но проблема заключается в том, что я вводил букву z, он возвращает Ç вместо того, чтобы возвращать букву f. Вот мой код до сих пор:Цезарный шифр с использованием ASCII возвращает C-cedilla

void strEncrypt(string userin) 
{ 
    char wordArray[userin.length()]; 
    strcpy(wordArray, userin.c_str()); 

    for (int i=0; i<userin.size(); i++) 
    { 
     if(wordArray[i]>=65 && wordArray[i]<91) 
     { 
      wordArray[i] = wordArray[i] + 6; 
      if (wordArray[i]>90) 
      { 
       wordArray[i] = wordArray[i]-26; 
      } 
     } 
     else if(wordArray[i]>=97 && wordArray[i]<123) 
     { 
      wordArray[i] = wordArray[i] + 6; 
      while(wordArray[i]>=123) 
      { 
       wordArray[i] = wordArray[i]-26; 
      } 
     } 
    cout << wordArray[i]; 
    } 
} 

Попробуйте скомпилировать и запустить его так, что вы будете иметь четкое представление о том, что моя проблема

ответ

2

Вы страдаете от подписанного целочисленного переполнения!

Многое из этого зависит от реализации/неопределенного поведения, но, отложив это, я собираюсь объяснить, что произошло.

Ваш тип char подписан и содержит значения от -128 до 127. 'z' имеет значение 122. Когда вы добавляете 6, это будет стать 128 ... если бы он был способен представлять это число. Однако максимальное значение равно 127, и оно переполняется. Он обертывается и становится -128.

Вы можете поставить чек перед добавлением, чтобы убедиться, что значение символа достаточно низкое, чтобы вы могли безопасно увеличить его, чтобы избежать этой проблемы.


В частности, char подписан ли или без знака зависит от реализации, signed char нужно только для хранения значений от -127 к 127 и подписал переполнении неопределенное поведение.

0

Вы переполнение, используя беззнаковое арифметику фиксирует код:

unsigned char wordArray[userin.length()]; 
strcpy((char *) wordArray, userin.c_str()); 
Смежные вопросы