allex777
(usa Ubuntu)
Enviado em 28/05/2008 - 13:03h
#include <stdio.h>
int leDados(char *arqN, char *cri, char *decri)
{
FILE *arq;
int i;
char teste[26];
char buf[200];
char t1, t2;
/* Incializando o vetor de troca */
for (i = 0; i < 26; i++)
cri[i] = decri[i] = i;
if (!(arq = fopen(arqN, "r"))) {
fprintf(stderr, "ERRO leDados: nao posso abrir %s\n", arqN);
return (0);
}
/* Arquivo de dados deve ter linhas, primeira coluna a letra a ser trocada,
segunda coluna por qual ira trocar.
Exemplo:
A X
B Y
C J
...
*/
/* Vetor teste servira para detectar inconsistencia no arquivo de dados.
Em todos os vetores a posicao 0 eh a do 'A', a posicao 1 eh a do 'B' e assim
por diante.
Exemplo de uma inconsitencia:
A X
B K
C X
'C' nao pode ser substituido por 'X' pois o 'A' ja eh por 'X'!!!
Outro exemplo:
A X
B Y
A K
Duas vezes a letra 'A'.
Linhas inconsistentes serao IGNORADAS
O vetor teste guarda a linha do arquivo que tinha a letra. No inicio eh tudo zero
se para uma letra for diferente de zero eh porque uma linha anterior ja o definiu
*/
for (i = 0; i < 26; i++)
teste[i] = 0;
/* Lendo o arquivo */
i = 0; // qtd linhas do arquivo
while (fgets(buf, 100, arq)) {
if (feof(arq)) {
return (i);
}
i++;
/* Arquivo de dados podem conter linhas vazias ou comentarios (comecando com #) */
if ((buf[0] == '\n') || (buf[0] == '#'))
continue;
t1 = buf[0];
t2 = buf[2];
/* se nao eh letra MAIUSCULA, transforma em maiuscula */
if ((t1 >= 'a') && (t1 <= 'z'))
t1 = t1 - 32;
if ((t2 >= 'a') && (t2 <= 'z'))
t2 = t2 - 32;
/* Se nao eh letra, entao tem inconsistencia no arquivo de dados */
if ((t1 < 'A') || (t1 > 'Z')) {
fprintf(stderr,
"ERRO leDados: linha %i de %s nao esta correta\n", i,
arqN);
continue;
}
if ((t2 < 'A') || (t2 > 'Z')) {
fprintf(stderr,
"ERRO leDados: linha %i de %s nao esta correta\n", i,
arqN);
continue;
}
t1 = t1 - 'A';
t2 = t2 - 'A';
if (cri[t1] != t1) {
fprintf(stderr,
"ERRO leDados: letra %c na linha %i e na linha %i no arquivo %s\n",
t1 + 'A', teste[cri[t1]], i, arqN);
continue;
}
if (teste[t2]) {
fprintf(stderr,
"ERRO leDados: letra %c REPETIDA nas linhas %i e %i de %s\n",
t2 + 'A', teste[t2], i, arqN);
continue;
}
teste[t2] = i;
cri[t1] = t2;
decri[t2] = t1;
}
return (i);
}
char *troca(char *texto, char *troca)
{
char l, mi, id;
char *buf;
buf = texto;
for (; *buf; buf++) {
mi = 0;
l = *buf;
if ((l >= 'a') && (l <= 'z')) {
mi = 32;
}
if ((l < 'A') || (l > 'Z')) {
if (mi == 0) {
continue;
}
}
id = l - 'A' - mi;
l = troca[id];
*buf = l + 'A' + mi;
}
return (texto);
}
int main()
{
char cri[26], decri[26];
char texto[200];
leDados("subs.txt", cri, decri);
/* lendo algo do teclado para criptografar */
printf("Digite uma string para CIFRAR: ");
fgets(texto, 200, stdin);
printf("Original = %s", texto);
troca(texto, cri);
printf("Criptografado = %s", texto);
troca(texto, decri);
printf("Descriptografado = %s", texto);
}