Flames Posted March 21, 2012 Report Share Posted March 21, 2012 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define Max 10 void maiscmins(char str[]); void incript(char str[],char lista1[],char lista2[]); int main() { char str[Max+1]; char lista1[26]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char lista2[26]="DEIABCFGHJKLZYXWVUTSRQPONM"; fgets(str,Max+1,stdin); maiscmins(str); /*passagem para maiusculas*/ incript(str,lista1,lista2); return 0; } void maiscmins(char str[]){ int i=0; while(str[i]!='\0'){ if (str[i] >= 'a' && str[i] <= 'z') str[i]= str[i] - 'a'+'A'; i++; } } void incript(char str[],char lista1[],char lista2[]){ int i=0; int j; /*percorrer as letras dos arrays encriptados*/ while(str[i]!='\0'){ for (j=0;j<26;j++){ if(str[i]==lista1[j]){ str[i]=lista2[j]; } } i++; } printf("%s",str); printf("%s",lista1); } /*ABCDEFGHIJKLMNOPQRSTUVWXYZ to DEIABCFGHJKLZYXWVUTSRQPONM*/ A passagem da criptografia está a falhar e nem me vem a ideia porque o A em vez de assumir D está a assumir A e por ai fora alguem consegue explicar o porquê? Ou tentar levar-me a esse destino? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 21, 2012 Report Share Posted March 21, 2012 não vi bem o código mas altera isto : for (i = 0; i < strlen(str); i++) str[i] = lista2[str[i] - 'A']; duas linhas de código e tens a alteração da string sem sequer usar lista1 podendo ficar assim : void maiscmins(char str[]); void incript(char str[]); int main() { char str[Max+1]; fgets(str,Max+1,stdin); maiscmins(str); incript(str); return 0; } void maiscmins(char str[]){ int i=0; for(i = 0; i < strlen(str); i++) { if (str[i] >= 'a' && str[i] <= 'z') str[i]= str[i] - 'a'+'A'; } } void incript(char str[]){ int i=0; char lista="DEIABCFGHJKLZYXWVUTSRQPONM"; for (i = 0; i < strlen(str); i++) str[i] = lista[str[i] - 'A']; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pmg Posted March 21, 2012 Report Share Posted March 21, 2012 O problema com o teu código é no ciclo que "encripta": depois de mudares uma letra não terminas o ciclo e continuas a procurar letras para mudar. Assim, para a letra A, o ciclo substitui por D mas continua a pesquisar ... até encontrar um D que substitui por A. int main() { char str[Max+1]; char lista1[26]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ATENÇÃO: lista1 não é uma string. Para ser uma string tem de incluir um '\0' num dos elementos. Como tens lá as 26 letras do alfabeto não tens espaço para o '\0'. void incript(char str[],char lista1[],char lista2[]){ /* ... */ printf("%s",lista1); E este uso de lista1 assume, erradamente, que lista1 é uma string. Sugestão: deixa o compilador calcular o tamanho dos arrays char lista1[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Com este código, lista1 terá 27 elementos e incluirá o '\0'; 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! Link to comment Share on other sites More sharing options...
Flames Posted March 21, 2012 Author Report Share Posted March 21, 2012 não vi bem o código mas altera isto : for (i = 0; i < strlen(str); i++) str[i] = lista2[str[i] - 'A']; duas linhas de código e tens a alteração da string sem sequer usar lista1 podendo ficar assim : void maiscmins(char str[]); void incript(char str[]); int main() { char str[Max+1]; fgets(str,Max+1,stdin); maiscmins(str); incript(str); return 0; } void maiscmins(char str[]){ int i=0; for(i = 0; i < strlen(str); i++) { if (str[i] >= 'a' && str[i] <= 'z') str[i]= str[i] - 'a'+'A'; } } void incript(char str[]){ int i=0; char lista="DEIABCFGHJKLZYXWVUTSRQPONM"; for (i = 0; i < strlen(str); i++) str[i] = lista[str[i] - 'A']; } Tens razao era só fazer o calculo pela tabela ascii e dava-me automaticamente o numero do "index" a substituir nunca pensei nisso :S o que torna inutil o primeiro array thanks 😁 Link to comment Share on other sites More sharing options...
Flames Posted March 21, 2012 Author Report Share Posted March 21, 2012 O problema com o teu código é no ciclo que "encripta": depois de mudares uma letra não terminas o ciclo e continuas a procurar letras para mudar. Assim, para a letra A, o ciclo substitui por D mas continua a pesquisar ... até encontrar um D que substitui por A. ATENÇÃO: lista1 não é uma string. Para ser uma string tem de incluir um '\0' num dos elementos. Como tens lá as 26 letras do alfabeto não tens espaço para o '\0'. E este uso de lista1 assume, erradamente, que lista1 é uma string. Sugestão: deixa o compilador calcular o tamanho dos arrays char lista1[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Com este código, lista1 terá 27 elementos e incluirá o '\0'; Pmg tens razao eu nao tinha reparado xD ele substituia o A por D e depois o D por A LOOOOOOOL!!!!!!!!!!!!!!!!!!!!!! ou fazia um break nessa zona ou entao usando o algoritmo do happyhippyhippo thanks 😁 ps: aquilo do 26 mais uma vez com razao só meti a ver o que dava... Link to comment Share on other sites More sharing options...
Dr_Lion Posted March 22, 2012 Report Share Posted March 22, 2012 Esse algoritmo bastante simples é facil de crackar com criptanálise e comparação de textos encriptados 😉 mas é um bom principio. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now