Так что в настоящее время я делаю программу 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];
}
}
Попробуйте скомпилировать и запустить его, чтобы у вас была более четкая картина того, в чем заключается моя проблема.
Вы страдаете от целочисленного переполнения со знаком!
Во многом это зависит от реализации / не определено поведение, но в стороне я собираюсь объяснить, что произошло.
Ваш char
Тип подписан и содержит значения из -128
в 127
, 'z'
имеет значение 122
, Когда вы добавляете 6
, Это было бы становиться 128
… если бы он был способен представить это число. Тем не менее, максимальное значение 127
и это переполняется. Оборачивается и становится -128
,
Вы можете поставить проверку перед сложением, чтобы убедиться, что значение персонажа достаточно низкое, чтобы вы могли безопасно увеличить его, чтобы избежать этой проблемы.
В частности, будь то char
подписан или не подписан, зависит от реализации, signed char
нужно только хранить значения из -127
в 127
и переполнение со знаком является неопределенным поведением.
У вас есть переполнение, используя неподписанные арифметические исправления вашего кода:
unsigned char wordArray[userin.length()];
strcpy((char *) wordArray, userin.c_str());