rockrgo 138 Denunciar post Postado Novembro 2, 2013 Bom dia pessoal, estou fazendo um trabalho para a faculdade sobre criptografia de dados, consegui montar um algoritimo seguindo a cifra de cesar, porém na minha função que faz a decriptação dos dados, não me acusa erro porém o programa para de funcionar. segue o código. void decifrar () { char mensagem [10000]; char cifrada [10000]; int i, tam_max, chave; FILE *arquivo; char nomeArquivo[1000]; system ("cls"); printf ("========== OPCAO 2 - DECRIPTOGRAFANDO ==========\n"); printf ("\n"); printf ("Digite o nome do arquivo que deseja decriptografar: "); fflush(stdin); gets (nomeArquivo); arquivo = fopen(nomeArquivo, "r"); printf("Digite a chave a ser utilizada (1 - 25): "); scanf("%d",&chave); fflush(stdin); while(chave<1 || chave>25) { printf("Por favor digite uma chave valida: "); scanf("%d",&chave); fflush(stdin); } tam_max=strlen(cifrada); for (i=0; !feof(arquivo); i++) { fscanf(arquivo, "%s", &cifrada[i]); mensagem[i] = cifrada [i] - chave; } mensagem[tam_max] = '\0'; printf ("\n"); printf ("Mensagem decifrada: %s", mensagem); getchar (); } o problema deve estar na hora de ler o arquivo, pois o programa para depois de digitar a chave. Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Novembro 2, 2013 Neste trecho do código: tam_max=strlen(cifrada); for (i=0; !feof(arquivo); i++) { fscanf(arquivo, "%s", &cifrada[i]); mensagem[i] = cifrada [i] - chave; } mensagem[tam_max] = '\0'; Antes de entrar no for você recupera o tamanha da string chamada cifrada. Mas, você ainda não realizou nenhuma operação nela, portanto tam_max vai receber uma quantidade qualquer (um número absurdo, tipo 143572547). Após o for, você usa esta variável para colocar o terminador da string. Só que, esta variável está indicando um lugar qualquer da memória. Por isso que o programa trava, provavelmente por violação de acesso de memória. Uma estratégia para resolver isso, pode ser utilizar o próprio contador i. Quando terminar a leitura do arquivo, o i estará apontando para o último caracter válido que foi lido do arquivo. Portanto, basta colocar o termindor de string na posição i+1. Para vizualizar melhor o que tentei explicar, pode depurar o código e monitorar as variáveis envolvidas. Aqui utilizei o GDB. Espero ter ajudado, FLW! Compartilhar este post Link para o post Compartilhar em outros sites
rockrgo 138 Denunciar post Postado Novembro 5, 2013 Cara valeu, entendi o erro sim....mas mesmo depois ainda não funcionava corretamente....agora está tudo funcionando corrigi o código e ficou assim: void decifrar (){ //Declaração das variáveis char mensagem [10000]; char cifrada [10000]; int i, tam_max, chave; FILE *arquivo; char nomeArquivo[1000]; //limpa a tela de saída system ("cls"); printf ("========== OPCAO 2 - DECRIPTOGRAFANDO ==========\n"); printf ("\n"); printf ("Digite o nome do arquivo que deseja decriptografar: "); fflush(stdin); //captura o nome do arquivo digitado gets (nomeArquivo); //abre o arquivo em modo de leitura arquivo = fopen(nomeArquivo, "r"); printf("Digite a chave a ser utilizada (1 - 25): "); //pega o valor da chave digitada scanf("%d",&chave); fflush(stdin); //garante que a chave tenha um valor maior que 1 e menor que 25 while(chave<1 || chave>25){ printf("Por favor digite uma chave valida: "); scanf("%d",&chave); fflush(stdin); } //atribui à variável cifrada o conteúdo do arquivo for (i=0; !feof(arquivo); i++){ fscanf(arquivo, "%s", &cifrada[i]); } //pega o tamanho da mensagem tam_max=strlen(cifrada); //faz a decriptação subtraindo o valor da chave para cada letra da mensagem for (i=0; i<tam_max; i++){ mensagem[i] = cifrada[i] - chave; } mensagem[tam_max] = '\0'; //Mostra na tela a mensagem decriptografada. printf ("\n"); printf ("Mensagem decifrada: %s", mensagem); getchar (); } Compartilhar este post Link para o post Compartilhar em outros sites