После того, как вы загрузили свою строку, вы можете использовать модульный оператор для вращения, не выходя за пределы пространства A-Z.
Я бы отслеживал, была ли буква заглавной:
bool isCaps = ( letter >= 'A' ) && ( letter <= 'Z' );
if( isCaps )
letter -= 'A'-'a';
, а затем просто сделайте шифрование следующим образом:
int shift = -3;
letter -= 'a'; // to make it a number from 0-25
letter = ( letter + shift + 26 ) % 26;
// add 26 in case the shift is negative
letter += 'a'; // back to ascii code
наконец закончим с
if( isCaps )
letter += 'A'-'a';
Итак, сложив все это вместе, мы получим:
char *mystring; // ciphertext
int shift = -3; // ciphershift
for( char *letter = mystring; letter; ++letter )
{
bool isCaps = ( *letter >= 'A' ) && ( *letter <= 'Z' );
if( isCaps )
*letter -= 'A'-'a';
letter -= 'a';
letter = ( letter + shift + 26 ) % 26;
letter += 'a';
if( isCaps )
letter += 'A'-'a';
}