Cryptage de Jules César

Signaler
Messages postés
15
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
27 novembre 2004
-
Messages postés
15
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
27 novembre 2004
-
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);
}
A voir également:

22 réponses

Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
"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);
Messages postés
114
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
5 avril 2012
1
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
Messages postés
114
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
5 avril 2012
1
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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
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...
Messages postés
15
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
27 novembre 2004

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) ?
Messages postés
114
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
5 avril 2012
1
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
Messages postés
114
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
5 avril 2012
1
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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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)
Messages postés
114
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
5 avril 2012
1
pourquoi tant de mystère...?
qu'est ce que ça implique ?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
for (i=0;i<srtlen(phrase);i++) {
phrase[i]+=code;
prase[i]=phrase[i]%256;
}

et la ça marche...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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 ?
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
for (i=0;i<srtlen(phrase);i++) {
phrase[i]+=code;
prase[i]=phrase[i]%256;
}

et la ça marche...
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
merde dsl 256 c'est simplement parceque 389 ne rentre pas sur un octet...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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
Messages postés
15
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
27 novembre 2004

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 ?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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'
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
je fais ce code et je send (mais je crois que mon os est mort... alors faudra patienter)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
#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...
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
j'oubliais : cherches plutot AES si tu veux rester dans les cryptages symétriques et RSA si tu veux passer aux asymétriques...