Вот мой код и что он делает (или должен делать):
Он перебирает слово / открытый текст string plaintext
, которое я хочу запутать. Это должно повторяться plaintextLength
-много раз. Состояния if
внутри цикла for
гарантируют, что запутаны только буквы алфавита. Все не алфавитные символы должны быть просто скопированы.
Когда я ввожу, например, keyword
баз и, например, plaintext
barfoo тогда мой код должен взять первый символ plaintext
, который будет символом b (ASCII: 98), и сдвинуть его на первый символ keyword
, который также будет символом b . Так что b в plaintext
следует сдвинуть на число 1 , поскольку b в keyword
является вторым символом в алфавите и поэтому имеет индекс из 1 (то есть a / A = 0 , b / B = 1 , c / C = 2, ..., z / Z = 25 ). b в plaintext
станет c (ASCII 99), и этот символ c будет сохранен в массиве cipher[0]
. Индекс, на который должен быть сдвинут символ в plaintext
, вычисляется функцией addIndex()
.
Тем не менее, все это работает нормально, пока не пройдет ASCII 122. Например. если мы перейдем к третьему символу r (ASCII: 114) в plaintext
, смещение его на z (= 25) приведет к тому, что ASCII будет 139. Поэтому, когда он достигает конец алфавита (ASCII 122), он должен начинаться снова с a соответственно ASCII 97. Эта строка кода cipher[i] = 97 + (ascii - 122);
должна выполнять эту работу. Но когда я запускаю программу, она не рассчитывается и сохраняет ascii
(значение 139) прямо в cipher[2]
.
Я думаю, что есть проблема с типизацией, но не могу понять, почему это происходит. Я имею в виду ascii
- целочисленное значение, поэтому добавление 97
и вычитание 122
из 139 не должно быть проблемой. Результат этого вычисления будет косвенно приведен к символу для сохранения в массиве cipher[]
.
Любая помощь будет принята с благодарностью.
(...)
int plaintextLength = strlen(plaintext);
char cipher[plaintextLength];
int ascii;
for (int i = 0; i < plaintextLength; i++)
{
/* capital letter (ASCII range 65 - 90) */
if (plaintext[i] >= 'A' && plaintext[i] <= 'Z')
{
(...)
}
/* small letter (ASCII range 97 - 122) */
else if (plaintext[i] >= 'a' && plaintext[i] <= 'z')
{
ascii = plaintext[i] + addIndex(lowerCaseKeyword[i % keywordLength]);
if (ascii > 'z')
{
cipher[i] = 97 + (ascii - 122); // it doesnt calculate it. Why?
}
else
{
cipher[i] = ascii;
}
}
/* copy over non-aphabetical character */
else
{
(...)
}
}
(...)
int addIndex(char character)
{
string abc = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < 26; i++)
{
if (character == abc[i])
{
return i;
}
}
return 0; // ATTETNTION: might return false information but is needed due to compiler bitching around
}