Executando verificação de segurança...
Em resposta a [Não disponível]
2

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).

Carregando publicação patrocinada...
1

Vou levar suas considerações, eu posso mesmo ter escrito algumas coisas que levassem você a pensar em outras, mas já concertei. Tudo que você escreveu, eu escrevi pensando em falar essas coisas. Espero melhorar a minha escrita para que as pessoas interpretem mais corretamente.