Почему использование % для перемещения буквы на определенное количество мест в массиве приводит к исчезновению массива?
Я хочу "зашифровать" (т.е. обратимо скрыть) строку, сдвинув каждую букву на определенное количество мест. Поэтому я попробовал 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 шт):
'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. Этот код всё ещё ужасен. Нет, УЖАСЕН!!!. Но это предмет для других вопросов.