Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

GustavoPeotta

Problema em Código(Criptografia)

Mensagens Recomendadas

GustavoPeotta

Bom pessoal, olá.

Antes que me mostrem os outros tópicos quero avisar-lhes que eu já procurei por aqui e no Google.

Peço ajuda para me mostrarem qual é o erro do meu código

Meu código consiste em utilizar a Cifra de Cesar, para quem não conhece a cifra de Cesar consiste em obter uma 'chave' onde deve ser um valor inteiro e esta chave é somada à mensagem que queremos criptografar.

Exemplo:

Queremos criptografar a palavra 'MENSAGEM' com um chave 4, portando adicionamos mais 4 letras para cada letra da palavra, ficando assim:

QIRWEKIQ

=============================================================

Agora vem o meu problema.

No meu código não posso adicionar caracteres especiais, ou seja, somente letras que vão de 'A' até 'Z'.

E na parte de DESCRIPTOGRAFIA não está dando certo.

Eu quero fazer com que uma palavra 'ANHYTW' fique 'VICTOR'.

Peço a ajuda de todos.. obrigado:

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define ENCRIPTOGRAFAR 1
#define DESENCRIPTOGRAFAR 2
#define SAIR 3

char *criptografa(char s[80], int cifra);
char *descriptografa(char s[80], int cifra);
int option;

int main() {
char s[80], sc[80], sd[80];
int cifra;
printf("MENU\n------------\n[1]\tENCRIPTOGRAFAR\n[2]\tDESENCRIPTOGRAFAR\n[3]\tSAIR\n\n");
scanf("%d",&option);

if (option == 1){
            fflush(stdin);
            printf("Informe o texto:\n");
            gets(s);

            printf("\nInforme o valor da cifra:\n");
            scanf("%d", &cifra);
            strcpy(sc, criptografa(s, cifra));

            printf("\nTexto criptografado:\n");
            printf("%s", sc);
            getch();
            }
    if (option == 2){
            fflush(stdin);
            printf("Informe o texto:\n");
            gets(s);

            printf("\nInforme o valor da cifra:\n");
            scanf("%d", &cifra);

            strcpy(sd, descriptografa(sc, cifra));
            printf("\n\nTexto descriptografado:\n");
            printf("%s", sd);
            getch();
            }
    else
            return 0;
            }


char *criptografa(char s[80], int cifra) {
int i, n = strlen(s);
char saux[80];
strcpy(saux, s);
for (i=0; i<n; i++) {
    if (saux[i]== 'z' || saux[i] == 'Z')
    saux[i] = 'a' + (cifra - 1);
    else
    saux[i] = saux[i] + cifra;
    }

    return(saux);
}


char *descriptografa(char s[80], int cifra) {
int i, n = strlen(s);
char saux[80];
strcpy(saux, s);
 for (i=0; i<n; i++) {

    saux[i] = saux[i] - cifra;
} return(saux);
}

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O array saux existe apenas dentro de cada função.

Quando a função termina, o array deixa de existir.

No entanto devolves o endereço do array. Quando a função original quer usar o endereço recebido, esse endereço não aponta para lado nenhum válido (o array deixou de existir).

Sugestão: usa o próprio array com os dados (através do seu endereço) para meter os resultados.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
GustavoPeotta

Muito obrigado pela dica Pmg, no entanto quero pedir desculpas pois não entendi muito bem..

Poderia me mostrar o código da parte que está errada.

Não estou querendo o código pronto, mas é que já fiz muitas modificações e ainda não consegui nada.. me desculpem..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu tenho sérias dúvidas que compile correctamente sequer ...

int main() {
// ...
 if (option == 1) {
   // ...
 }
 if (option == 2) {
   // ...
 }
 else
   return 0;

 // o return final ??
}

(os professores devem continuar a achar que ensinar indentação é para code monkeys ...)

o teu problema é que implementas mal a cifra nos valores que levam a que o caracter codificado/descodificado fique fora dos limitas do contradomínio.

por outras palavras, o problema está aqui :

char * criptografa(char s[80], int cifra) {
int i, n = strlen(s);
char saux[80];

strcpy(saux, s);
for (i=0; i<n; i++) {
// A PARTIR DAQUI -----------------------------------------------
	if (saux[i]== 'z' || saux[i] == 'Z')
		saux[i] = 'a' + (cifra - 1);
	else
		saux[i] = saux[i] + cifra;
// ATÉ AQUI -----------------------------------------------------
}

return saux;
}

char * descriptografa(char s[80], int cifra) {
int i, n = strlen(s);
char saux[80];

strcpy(saux, s);
for (i=0; i<n; i++) {
// A PARTIR DAQUI -----------------------------------------------
	saux[i] = saux[i] - cifra;
// ATÉ AQUI -----------------------------------------------------
}

return saux;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.