Типирование персонажа в Int и выполнение арифметики не работает - PullRequest
0 голосов
/ 15 мая 2018

Вот мой код и что он делает (или должен делать):

Он перебирает слово / открытый текст 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

}

...