Voilà, ça fonctionne avec n'importe quelle clée, mis à part que l'on pourrait se servir de l'opérateur modulo afin d'éviter le tableau...
Et même remarque que pour ton prog : Eviter les strlen dans les boucles for ;)
A+ !
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 29 janv. 2004 à 21:35
Evite de mettre des strlen d'une chaine de caractere dans le test d tes boucles for, c'est peu recommender, c'est cense le calculer a chaque fois, donc c'est long. Comme ceci est constant au niveau de la boucle, calcule le une fois pour toute en le mettant dans un variable.
(Peut etre que le compilateur optimise, mais tu n'es pas cense compter la dessus)
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 29 janv. 2004 à 01:40
tant qu'à débuter, débute en C++ ;-)
dsl, j'ai pas franchement le tps de lire ton code source mtnt, j'essayerai pe de repasser une autre fois, mais je peux franchement rien te promettre
11 juil. 2016 à 16:40
ça va mieux en remplaçant flushall() par :
fflush (stdin);
en tout cas sans ça, ça compile pas sous code::blocks.
8 juin 2004 à 21:27
Enfin, voilà la source si ça peut te servir... :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TS 93
#define MODE_CRYPT 1
#define MODE_DECRYPT 2
int
main( int ac, char *av[ ] )
{
char Message[ 100 ] ;
char Cle [ 100 ] ;
char Filtre [ 100 ] = "" ;
char MsgCode[ 100 ] = "" ;
char Tableau[ TS ] [ TS ] = {'a','b','c','d','e','f','g','h', 'i','j','k','l','m','n','o','p', 'q','r','s','t','u','v','w','x', 'y','z',' ','A','B','C','D','E', 'F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U', 'V','W','X','Y','Z','0','1','2', '3','4','5','6','7','8','9','0', ',',';',':','!','?','.','/','*', '$','(',')','[',']','{','}','_', '-','°','@','%','<','>','\'','é', 'è','"','à','+','='} ;
unsigned int i, j, k ;
unsigned int select ;
// On remplit le tableau
for( i = 1 ; i < TS ; i ++ )
for( j = 0 ; j < TS ; j ++ )
Tableau[ i ] [ j ] = Tableau[ 0 ] [ (i + j) % TS ] ;
while( 1 )
{
printf( "\n\nQue voulez-vous faire ? :\n"
"1...Crypter une chaine.\n"
"2...Decrypter une chaine.\n"
"0...Quitter.\n" ) ;
select = 3 ;
while( select > 2 )
{
printf( "\nVotre choix ? : " ) ;
scanf( "%d", &select ) ;
}
if( select )
{
printf( "Entrez un message : " ) ;
flushall( ) ;
if( select == MODE_CRYPT )
gets( Message ) ;
else
gets( MsgCode ) ;
printf( "Entrez la clef : " ) ;
gets( Cle ) ;
// Copie de la clée dans Filtre
while( strlen( Filtre ) <= strlen( Message ) )
strcat( Filtre, Cle ) ;
switch( select )
{
case MODE_CRYPT :
// Codage
for( i = 0 ; i < strlen( Message ) ; i ++ )
{
// Abscisse dans j
for( j = 0 ; j < TS ; j ++ )
{
if( Message[ i ] == Tableau[ 0 ] [ j ] ) break ;
}
// Ordonnée dans k
for( k = 0 ; k < TS ; k ++ )
{
if( Filtre[ i ] == Tableau[ k ] [ 0 ] ) break ;
}
// On stock le caractère codé
MsgCode[ i ] = Tableau[ k ] [ j ] ;
}
printf( "\nMessage code : %s\n\n", MsgCode ) ;
break ;
case MODE_DECRYPT :
// Décodage
for( i = 0 ; i < strlen( MsgCode ) ; i ++ )
{
// Ordonnée dans j
for( j = 0 ; j < TS ; j ++ )
if( Filtre[ i ] == Tableau[ j ] [ 0 ] ) break ;
// Abscisse dans k
for( k = 0 ; k < TS ; k ++ )
if( MsgCode[ i ] == Tableau[ j ] [ k ] ) break ;
// On stock le caractère décodé
Message[ i ] = Tableau[ 0 ] [ k ] ;
}
printf( "\nMessage decode : %s\n\n", Message ) ;
break ;
}
} /* if select */
else
break ;
} /* while( 1 ) */
return 0 ;
}
Voilà, ça fonctionne avec n'importe quelle clée, mis à part que l'on pourrait se servir de l'opérateur modulo afin d'éviter le tableau...
Et même remarque que pour ton prog : Eviter les strlen dans les boucles for ;)
A+ !
29 janv. 2004 à 21:35
(Peut etre que le compilateur optimise, mais tu n'es pas cense compter la dessus)
29 janv. 2004 à 01:40
dsl, j'ai pas franchement le tps de lire ton code source mtnt, j'essayerai pe de repasser une autre fois, mais je peux franchement rien te promettre
bonne continuation!