Почему использование % для перемещения буквы на определенное количество мест в массиве приводит к исчезновению массива?

Я хочу "зашифровать" (т.е. обратимо скрыть) строку, сдвинув каждую букву на определенное количество мест. Поэтому я попробовал 3:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
    string code;
    int i;
    code = get_string("Write your plaintext...\n");
    for(i=0;i<strlen(code);i++)
    {
        if (code[i]!=' '&code[i]!='!'&code[i]!='?'&code[i]!='.')
        {
        code[i]= ((code[i]+3)%26);

        //printf("%i%c\n",i,code[i]);
        }
    }
    printf("%s\n", code);

}

Но я ничего не получаю в ответ:

~/pset2/ $ ./caesar_hugues 
Write your plaintext...
Hello World!

~/pset2/ $ 

Поэтому, когда вы сделали только (code[i]+3), это работает, но не работает для букв в конце abcedar.

Пробовал добавлять, например, букву «а»:

printf("%c", ('a' + code[i]+3)%26);

Но ничего не возвращает

~/pset2/ $ ./caesar_hugues 
Write your plaintext...
Hello, World!

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

'e' имеет ASCII код 101. Добавим 3 возьмём по модулю 26: (101 + 3) % 26 = 104 % 26 = 0. 'e' вторая буква во фразе "Hello, World!". То есть, на второй итерации вашего цикла в строку вписывается ноль, который обозначает конец ASCIIZ строки. Цикл прерывается, в заголовке strlen(code), который теперь вернёт 1.

AlexGlebe предложил вам добавить 'a' чтобы такого не было. У вас не получилось. Вот работающий код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char code[] = "Hello, World!";
    size_t i;
    for(i=0;i<strlen(code);i++)
    {
        if ((code[i]!=' ')&(code[i]!='!')&(code[i]!='?')&(code[i]!='.'))
        {
        code[i]= 'a' + ((code[i]+3)%26);
        }
    }
    printf("%s\n", code);
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror -O cipher.c && ./a.out 
xahhkv mknhz!

P.S. Этот код всё ещё ужасен. Нет, УЖАСЕН!!!. Но это предмет для других вопросов.

→ Ссылка