Alguns pontos importantes.
Embora tecnicamente isso seja uma forma de criptografia, ela é extremamente básica. Ajuda entender de forma simples, mas sem um alerta pode dar a impressão que a criptografia da vida real é simples, e na verdade é extremamente mais sofisticada e nada se parece com isso.
Outro ponto que quero destacar é que, se não termina com um nulo '\0'
, não é uma string em C. E se não for assim, não pode ser usado em nenhum outro lugar padrão da linguagem ou onde se espera uma. E é onde, inclusive, cria falhas de segurança tão faladas hoje em dia.
Se fosse uma string, teria que ter pelo menos mais um elemento no array com o terminador, e claro, a declaração teria que reservar espaço para ele, portanto nos exemplos da PO seria 3 e 12.
O terminador é contado no tamanho do objeto. Ele não entra na contagem de caracteres. Se usar um sizeof
, onde é possível, ou um strlen()
, em geral, dá resultados diferentes.
Também é bom notar que não são os programadores que começam a contar do 0, a matemática é assim o primeiro positivo é o 0. Posição é diferente de quantidade. E C escolheu adotar essa regra. Tem linguagem que programadores usam que começam da posição 1. Há mais programadores que preferem começar do 0 porque há mais situações que isso encaixa melhor. Mas preferir é diferente de ser o que a tecnologia adotou.
Entendo a simplificação para facilitar o entendimento, mas pelo menos precisa de alerta que não está ensinando a forma correta. Uma das cosias que mais vejo hoje em dia é a pessoa aprender um simples incorreto e depois ela continua assim, e em seguida ensina incorreto porque foi como aprendeu. Então é preciso deixar isso claro.
Para quem quer ver como string real de forma idiomática, ficaria assim:
#include <stdio.h>
int main(void) {
char texto[] = "GostoDeVoce";
int i = 0; //size_t é mais correto, mas deixei int para facilitar
while (texto[i] != '\0') printf("%c", texto[i++] + 1);
}
Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.
Guardei o texto em um array de char
de tamanho a ser determinado pelo compilador de acordo com o tamanho do texto literal usado na atribuição. Terá um byte a mais para o caractere terminador, que o compilador sabe que existe em um literal (entre aspas).
Varri toda a string, até achar o caractere nulo, quando encerra o laço. Note que o incremento dos caracteres, como costuma acontecer em C está dentro do bloco de execução do laço.
Os acentos podem ser problemáticos, preferi não mexer nisso em algo tão simplificado. Usou-se um formatador apropriado para 1 caractere.
Em JS:
let texto = "GostoDeVoce";
let cripto = "";
for (let i = 0; i < texto.length; i++) cripto += String.fromCharCode(texto[i].charCodeAt() + 1);
console.log(cripto);
Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.
Teve que converter para número e depois o número para caractere porque não tem tranformação direta em JS. C e JS são linguagens de tipagem fraca, mas de formas completamente diferentes, inclusive porque uma é estática e outra é dinâmica. Preferi construir uma nova string para evitar que a impressão seja feita em cada linha, não quis usar stdout
ou algo parecido.
A técnica básica é realmente manipular o texto, somar 1 (deslocar uma posição na tabela ASCII) é a mais simples que existe.
Faz sentido para você?
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).