Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rockrgo

erro decriptação de arquivo

Recommended Posts

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.