Вы выводите только те символы, которые вы преобразовываете (те, которые находятся в наборе isalnum
).Вам также необходимо вывести символы без преобразования.Например:
char cipher = original[i] ;
if( isalnum( original[i] )
{
cipher += k ;
}
printf( "%c", cipher ) ;
Однако описанный алгоритм по-прежнему глубоко ошибочен в нескольких аспектах, но неясно, является ли это присвоение ошибочным (в этом случае это не ваша проблема) или вашописание назначения является неточным.
Более практичное решение может выглядеть следующим образом:
#include <ctype.h>
char caesar( char x, int key )
{
const char alphabet[] = {'a','b','c','d','e','f','g','h',
'i','j','k','l','m','n','o','p',
'q','r','s','t','u','v','w','x',
'y','z',
'0','1','2','3','4','5','6','7','8','9'};
char cipher = x ;
for( int i = 0;
cipher == x && i < sizeof( alphabet );
i++ )
{
if( alphabet[i] == tolower( x ) )
{
cipher = alphabet[(i + key) % sizeof( alphabet )] ;
if( isupper( x ) )
{
cipher = toupper( cipher ) ;
}
}
}
return cipher ;
}
Тогда ваш цикл вывода будет выглядеть следующим образом:
for( int i = 0; original[i] != '\0' ); i++)
{
printf("%c", ceasar( original[i], k ) ) ;
}