Cryptage de Jules César

thedivxboy Messages postés 15 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004 - 16 nov. 2004 à 22:08
thedivxboy Messages postés 15 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004 - 20 nov. 2004 à 15:33
Pourquoi ce code plante quand je mets un scanf ?
Et pourquoi lorsque je retire 27 au résultat crypté si il dépasse l'alphabet, cela m'affiche des caractères bizarres ?

#include <stdio.h>

void main() {
char i,j,alph[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ",phrase[100]={0},code,res[100]={0};

printf("Introduisez la phrase à crypter : ");
scanf("%s",&phrase);

printf("Entrez une clé de cryptage : ");
code=getchar()-48;
// scanf("%d",&code);

while(code>26)
code-=26;

printf("\n\nRésultat crypté : ");

for (i=0;i<sizeof(phrase)&&phrase[i]!='\0';i++) {
for(j=0;phrase[i]!=alph[j];j++);
if(alph[j]+code>sizeof(alph))
res[i]=(alph[j]+code)-27;
else
res[i]=alph[j]+code;
}

printf("%s",res);
}

22 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 nov. 2004 à 22:21
"void main(){" => déja la c'est pas bon, c'est
int main(void){
enfin le void en argument n'est pas obligatoire...
ensuite on a pas besoin de l'alphabet, on se sert des codes ascii...

"&&phrase[i]!='\0'"=> totalement inutile

et sinon pour coder c'ets plus simple et plus rapide comme ça...
for (i=0;i<sizeof(phrase);i++) {
phrase[i]+=code;
}
printf("%s",phrase);
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
16 nov. 2004 à 22:21
tu n'as pas besoin de mettre" &"phrase, phrase désigne déjà une adresse (celle du premier élément du tableau de 100 caractères)

attention à ton point-virgule derrière ton second for, il ne doit pas être voulu...

6co
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
16 nov. 2004 à 22:28
au fait, coucou747, au lieu de mettre sizeof(phrase) en condition de fin de boucle, j'utiliserais la fonction strlen(phrase) pour éviter de mettre &&phrase[i]!='\0'

6co
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 nov. 2004 à 22:52
exact mais j'ai pas pensé sur le coup, en fait c'est même totalement diférent car sizeof renveras le nombre de cases du tableau, alors que la chaine n'utilises pe pas tout le tableau...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
thedivxboy Messages postés 15 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004
16 nov. 2004 à 23:49
Wow wow wow que de réponses en si peu de temps :)

Bon alors le void main() { } c'est comme ça qu'on me l'a appris. Donc donnez plus d'explications pour que je comprenne la différence.

"&&phrase[i]!='\0'" --> ça aussi on me l'a appris, mais je pense qu'il est nécessaire sinon il va aussi transformer les 0 de la table phrase ...

Ta façon de coder en ASCII n'est pas logique car si je rentre la lettre Z (90 en ASCCI) et que je lui applique un décalage de 5 je vais me retrouver avec _ (95 en ASCII) au lieu de E. Voilà pourquoi j'utilise l'alphabet dans une variable.

Je sais que le &phrase n'est pas obligatoire mais bon c'est plus lisible comme ça :big)
Quand au ; après le for c'est voulu puisque celui-ci ne contient aucune instructions. Donc de point-virgule stipule la fin du for. Corrigez moi si je me trompe ...

Comment fonctionne strlen(phrase) ?
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
17 nov. 2004 à 00:00
ok j'avais à peine lu le code, désolé...

pour le int main(), disons que c'est une norme mais le void main(void) fonctionne également (quelques compilateurs le refuseront peut-être, il y a toujours des exceptions)...

au sujet du &phrase, tu ne m'as pas compris :
scanf("%s",phrase) -> ça marche
scanf("%s",&phrase) -> ça marchera pas
il n'y a aucune question de lisibilité la-dedans...

enfin pour strlen(phrase), c'est une fonction qui te renvoie la longueur d'une chaîne de caractères (jusqu'au zéro final), elle remplace donc aisément une boucle qui le cherche en incrémentant un entier...

laisse moi le temps de zyeuter ton code d'un peu plus près et je t'envoie une réponse concernant tes caractères bizarres après le "passage à la moulinette" de ta phrase

6co
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
17 nov. 2004 à 00:12
ton code semble fonctionner...
le seul problème est que getchar() ne te laisse pas prendre le temps de choisir une clé, non ? alors il prends la valeur de la touche [ENTRER] et comme tu enlèves 48 à cette valeur, ça te laisse une valeur négative...
remplace getchar() par getch(), il faut inclure <conio.h> ou <coinio.c> sous dev++

je viens de me rendre compte que void main() ne passe pas sous dev++ par exemple....

6co
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
17 nov. 2004 à 01:04
non, en c void main() est autorisé, mais tu dois compiler un .cpp (ou .C) sans savoir ce que ca implique (interdit en c++)

et on inclus jamais un .c (fichier source)
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
17 nov. 2004 à 01:11
pourquoi tant de mystère...?
qu'est ce que ça implique ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
17 nov. 2004 à 09:50
compile le c avec un compilateur c, c et c++ ne sont pas tout à fais compatible, le dernier standard du c est meme incompatible avec c++

c et c++ sont deux langages distincts
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 nov. 2004 à 12:25
for (i=0;i<srtlen(phrase);i++) {
phrase[i]+=code;
prase[i]=phrase[i]%256;
}

et la ça marche...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
17 nov. 2004 à 12:36
comme ca c'est mieux

size_t size = strlen( phrase );
for( i=0; i<size; i++ )
{
...
}

ca sert à quoi prase[i]=phrase[i]%256; ?
ca sort d'ou ce 256 ?
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 nov. 2004 à 13:03
for (i=0;i<srtlen(phrase);i++) {
phrase[i]+=code;
prase[i]=phrase[i]%256;
}

et la ça marche...
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 nov. 2004 à 13:07
merde dsl 256 c'est simplement parceque 389 ne rentre pas sur un octet...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
17 nov. 2004 à 14:09
ben 256 non plus ?? (si char == 1octet, unsigned char = 0, 255)

ce que je veux dire c'est que si on admet que char == 1octet, alors
phrase[i] %= 256; est inutile

moi j'aimerais bein voir le programme complet qui permet de crypter et surtout de decrypter
0
thedivxboy Messages postés 15 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004
17 nov. 2004 à 14:41
C'est vrai ça, personne pour faire les modifs et afficher le prog complet ? Car là on y comprend plu rien ...

Quand au signe & dans le scanf si j'ai bien écouté au cours lorsqu'on se sers d'un tableau on peut faire ainsi :
tab
&tab
tab[0]
&tab[0]

Me tompe-je ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
17 nov. 2004 à 14:53
ce qu'il faut savoir c'est que l'operateur & (adress of) porte sur des l-value (qui ont une adresse) et le résultat n'est pas une l-value

tab suffit, comme ca à deja été dit, le nom d'un tableau c'est son adresse (adresse de son premier element)

&tab, c'est sémantiquement incorrecte car tab n'est pas une l-value

tab[0], ce n'est pas une adresse

&tab[0], correcte

conclusion, utilises toujours 'tab'
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 nov. 2004 à 16:54
je fais ce code et je send (mais je crois que mon os est mort... alors faudra patienter)
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 nov. 2004 à 17:20
#include <stdio.h>
#include <string.h>

int main(void) {
unsigned char phrase[256], key=12;
int i, methode;
for (i=0;i<256;i++) {
phrase[i]=0;
}
printf("phrase :");
scanf("%s",phrase);
printf("\nentrez un nombre entre [0 et 9]\n :");
while ( key > 10){
printf("\n:");
key=getchar() - 48;
}
printf("entrez 0 pour crypter et 2 pour décrypter\n");
while ( methode !=1 && methode !=-1){
printf("\n:");
methode=getchar() - 49;
}
printf("\nclef :%d \t\t\t methode : %d\n", key, methode);
for (i=0;i<256 && phrase[i]!=0;i++) {
phrase[i]=phrase[i]+key*methode;
}
printf("__résultat__\n=%s\n__",phrase);
}

surement très primitif comme code (pas d'ouverture de ficheir.... pas d'interface...) mais de toute façon la technique de codage est très primitive...
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 nov. 2004 à 17:21
j'oubliais : cherches plutot AES si tu veux rester dans les cryptages symétriques et RSA si tu veux passer aux asymétriques...
0
Rejoignez-nous