Я заметил несколько серьезных проблем.
1) Вы не зацикливаетесь при переключении.Таким образом, если shift = 20 и вы получаете символ 'y', когда вы делаете это:
asciiCode = static_cast<int>(ch); //Change it to the ASCII number
asciiCode += shift; //Do the shift
ch = static_cast<char>(asciiCode);
asciiCode становится 'y' + 20 == 141, что находится за пределами стандартного 128-битного ascii.Вам нужно взять номер мода, я думаю, 128. Итак:
asciiCode = static_cast<int>(ch); //Change it to the ASCII number
asciiCode += shift; //Do the shift
asciiCode %= 128; // Wrap around
ch = static_cast<char>(asciiCode);
2) Но это все равно не решает, почему вы перемещаете только буквенные символы, но переводите эти буквы в не-буквенныесимволы в результате.
И почему вы считаете их в массиве размером 128 вместо 52?Или просто 26?
Более того, почему вы генерируете значение сдвига в коде?Вам нужно знать это значение для последующего декодирования ...
Короче, я рекомендую вам сделать это следующим образом:
- Перевести символы в числа 0-51, а не 0-127 (или 0-25)
- При применении сдвига добавьте его к значению 0-51, затем возьмите% 52, чтобы получить новый символ.
- Рассмотрите возможность ввода сдвига вручнуюзначение.
Вот как обычно работает Ceasar Cypher.
3) Что касается проблемы печати, вы пробовали отладку?
Я не могу говоритьо Bloodshed C ++, но даже простое добавление оператора cout было бы очень полезно.Например:
std::cout << ch; //Print to cout for debugging
outfile << ch; //Print to the outfile
даст вам знать, если ошибка в обработке файла.