Обратите внимание, что fgets
может возвращать "символ новой строки" ('\n'
) в конце строки. Вы можете удалить символ новой строки из буфера.
Если в строке есть пробелы, символ '\n'
или любые символы, не входящие в диапазон A-Z или a-z, игнорируйте эти символы, поскольку они не соответствуют логике для шифра caeser.
char * c = malloc( sizeof(char) * 1000);
while(fgets(c, sizeof(c), fp) != 0) { ... }
Как уже упоминалось в комментариях, c
является указателем, а sizeof(c)
обычно составляет 4 или 8 в этом случае. Таким образом, вы говорите fgets
читать максимум 4 или 8 байтов. Но каждая строка в файле может быть намного длиннее. Если бы вы объявили, скажем, char c[1000];
, тогда sizeof(c)
будет 1000
. В противном случае не используйте оператор sizeof
здесь.
while(i < len) {...}i++;
Вы хотите добраться до конца строки и увеличивать ее внутри цикла, поэтому измените условие на:
while(i < len) {... i++;}
Наконец, c
или ch
обычно используется для обозначения символа. Это неформально и на самом деле не имеет значения, но более понятно использовать buf
или str
, если вы объявляете строку.
Пример:
void caeser(char *buf, int shift)
{
int i = 0;
int len = strlen(buf);
while(i < len)
{
char c = buf[i];
if(c >= 'a' && c <= 'z')
buf[i] = (c - 'a' + shift) % 26 + 'a';
else if(c >= 'A' && c <= 'Z')
buf[i] = (c - 'A' + shift) % 26 + 'A';
//else, do nothing if chararacter is not between a-z or A-Z
i++;
}
}
int main(void)
{
FILE* fp = fopen(FILE_NAME, "r");
if(fp == NULL)
{
printf("Can't open %s\n", FILE_NAME);
exit(EXIT_FAILURE);
}
int buf_size = 1000;
char *buf = malloc(sizeof(char) * buf_size);
while(fgets(buf, buf_size, fp))
{
//optional: remove the new line character if any
int len = strlen(buf);
if(len && buf[len - 1] == '\n')
buf[len - 1] = 0;
printf("plain : %s\n", buf);
caeser(buf, 1);
printf("cipher: %s\n\n", buf);
}
//free the buffer allocated with malloc
free(buf);
fclose(fp);
return 0;
}