Eu estou implementando um programa para encriptar/decriptar uma mensagem através do método de César ou cifra de César..
A princípio o código funciona, porém estou tendo problemas quando o usuário digita uma mensagem com espaços.
Aqui está o código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define tamanho 500
void limpar_tela();
int pega_mensagemEchave(int op, int chave, char* mensagem);
void aplicaMetodo_mensagem(int op, int chave, char* mensagem);
void limpar_tela(){
system("clear || cls");
}
int pega_mensagemEchave(int op, int chave, char* mensagem){
switch(op){
case 1:
printf("\n\nDIGITE A MENSAGEM QUE DESEJA CIFRAR: ");
break;
case 2:
printf("\n\nDIGITE A MENSAGEM QUE DESEJA DECIFRAR: ");
break;
}
fflush(stdin);
scanf("%[^\n]", mensagem);//PEGA TUDO O QUE VEM ANTES DO ENTER(\n) E ARMAZENA NA VARIÁVEL mensagem;
fflush(stdin);
printf("\n\nDIGITE A QUANTIA DE LETRAS DESLOCADAS: ");
scanf("%d", &chave);
return chave;
}
void aplicaMetodo_mensagem(int op, int chave, char* mensagem){
int i, tamanho_texto= strlen(mensagem); //O TAMANHO DO TEXTO É DEFINIDO COM A FUNÇÃO strlen DA BIBLIOTECA string.h;
printf("%d", chave);
//LOOP DO COMEÇO DO VETOR ATÉ O FINAL DELE;
for(i= 0; i< tamanho_texto; i++){
switch(op){
case 1:
mensagem[i]+= chave;
//CASO A LETRA+CHAVE SEJA UM ESPAÇO, O VETOR RECEBE O PRÓPRIO ESPAÇO;
if(mensagem[i]== 32){
mensagem[i]= 32;
//CASO A LETRA+CHAVE PASSE DE 'Z' E SEJA MENOR QUE 'z' OU APENAS SEJA MAIOR QUE 'z', A CONTAGEM REINICIA NO COMEÇO DO ALFABETO;
}else if((mensagem[i]> 90 && mensagem[i]< 97) || mensagem[i]> 122){
mensagem[i]-= 26;
}
break;
case 2:
mensagem[i]-= chave;
//CASO A LETRA+CHAVE SEJA UM ESPAÇO, O VETOR RECEBE O PRÓPRIO ESPAÇO;
if(mensagem[i]== 32){
mensagem[i]= 32;
//CASO A LETRA-CHAVE NAO CHEGUE EM 'a' OU NAO CHEGUE EM 'A', A CONTAGEM VAI PRO FINAL DO ALFABETO;
}else if(mensagem[i]< 65 || (mensagem[i]< 97 && mensagem[i]> 90)){
mensagem[i]+= 26;
}
break;
}
}
}
int main(){
int chave, op, continuar;
char mensagem[tamanho];
//LOOP PRINCIPAL PARA RODAR NOVAMENTE SE DIGITAR 'S';
do{
limpar_tela();
printf("\n\n\n\t\t\t\t\t\t\t%c DECIFRADOR/CIFRADOR DE C%cDIGOS DE ACORDO COM O SISTEMA CESAR %c\n\n\nO QUE DESEJA FAZER?\n\n1- CIFRAR UMA MENSAGEM.\n2- DECIFRAR UMA MENSAGEM.\n0- SAIR.\n", 179, 224, 179);
scanf("%d", &op);
if(op> 0){
limpar_tela();
chave= pega_mensagemEchave(op, chave, mensagem);
aplicaMetodo_mensagem(op, chave, mensagem);
switch(op){
case 1:
printf("\nMENSAGEM CIFRADA:\n%s", mensagem);
break;
case 2:
printf("\nMENSAGEM DECIFRADA:\n%s", mensagem);
break;
}
}else{
break;
}
printf("\n\n\n\nDESEJA DECIFRAR/CIFRAR NOVAMENTE?\n\nTECLE 'S' PARA UTILIZAR O PROGRAMA NOVAMENTE.\nTECLE 'ENTER' PARA SAIR.\n");
fflush(stdin);
scanf("%c", &continuar);
fflush(stdin);
}while(continuar== 's' || continuar== 'S');
limpar_tela();
return 0;
}
Eu tentei fazer uma comparação com o valor decimal do espaço segundo a tabela ASCII, mas não sei por qual motivo eu não to conseguindo que o printf seja um espaço assim como a entrada..
Se alguém puder dar uma lida e me ajudar, agradeço.. Valeu