Цезарь с использованием ASCII возвращает C-Cedilla

Так что в настоящее время я делаю программу cesar cipher, использующую коды ASCII для алфавита, где исходный текст будет сдвигаться на 6 символов вправо, но проблема в том, что когда я вводю букву z, она возвращает Ç вместо возврата буквы f. Вот мой код до сих пор:

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];
}
}

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

1

Решение

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

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

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

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


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

2

Другие решения

У вас есть переполнение, используя неподписанные арифметические исправления вашего кода:

unsigned char wordArray[userin.length()];
strcpy((char *) wordArray, userin.c_str());
0