Code César : chiffré et déchiffrer un message en C

Fermé
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 - Modifié le 11 avril 2023 à 16:35
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 14 avril 2023 à 11:23

Bonjour, s'il vous plaît quelqu'un peut m'aider ici, 

Ecrire un programme C qui permet de coder un message à l’aide du code Césaravec n’importe quel texte saisie au clavier.

#include <string.h>
int main()
{
    char message[] = {"JESUS EST SEIGNEUR"};
    char msg_crypte[100];
    long i;
    for (i =0;i<strlen(message); i++)
        ;
    {
    msg_crypte[i] = message[i] + 3;
    }
    printf("%s \n", message);
    printf("%s \n", msg_crypte);
    return 0;
}


Android / Chrome 107.0.5304.105


A voir également:

32 réponses

Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
Modifié le 9 avril 2023 à 07:32
#include <string.h>
#include<ctype.h>
int main()
{
    char message[10000];
printf("entrez le message: ");
gets( message);

    char msg_chiffre[10000];
     printf("msg_chiffre: ");
    long i;
    for (i = 0; i < strlen(message); i++) 

  {
     msg_chiffre[i] = message[i] + 3;
  }
  printf("%s \n", msg_chiffre);


{
    char message_chiffre[10000];
printf("entrez le message chiffre :");
gets( msg_chiffre);

    char msg_dechiffre[10000];
     printf("msg_dechiffre: ");
    long i;
    for (i = 0; i < strlen(msg_chiffre); i++) 

  {
     msg_dechiffre[i] = msg_chiffre[i] -3;
  }
  printf("%s \n", msg_dechiffre);
}
return 0;
}

Voici le code source , j'ai aussi arranger au niveau de la différence entre crypté et chiffré 


1
Utilisateur anonyme
6 avril 2023 à 09:29

C'est très bien pour la présentation.

Mais tant que tu n'expliques pas ce qui te pose problème, on ne pourra pas t'aider.


0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 6 avril 2023 à 11:35

Salut Shadow_74,

Déjà, si tu supprimes le ; en ligne 8 de ton code posté, tu devrais voir un premier résultat s'afficher.

L'algorithme n'est cependant pas bon car si tu as la lettre X et que tu incrémentes son code ASCII de 3, tu dois te retrouver avec le code ASCII de la lettre A. Ton code ne gère pas cela.

https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage

(permutation circulaire de l'alphabet)

Il devrait aussi gérer les minuscules, qui sont sur une plage de codes ASCII différente.

https://www.ascii-code.com/fr

Par ailleurs, ton énoncé a l'air de demander que le texte soit saisi au clavier. Tu n'as pas fait cette partie.

Aussi :

  • tu dois ajouter un include pour stdio.h
  • cela serait mieux de ne faire strlen(message) qu'une fois au lieu de répéter l'appel à cette fonction dans la boucle
  • tu dois décider ce que tu fais des espaces, ponctuations ou autres caractères que des lettres de A à Z (souvent, elles ne sont pas encodées dans ces exercices simplifiés)

0

Si tu veux le faire pour la différence entre minuscules et majuscules et passer par dessus les ponctuations,,
Tu pourrais regarder du côté de l'entête <ctype.h>
et les fonctions isalpha() et isupper() ou islower()
On peut faire ce  genre d'arithmétique avec les caractères:
    char c = 'j';
    char d = c - 'a';      // position relative par rapport au 'a'

0

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

Posez votre question
Utilisateur anonyme
7 avril 2023 à 08:30

Bonjour Pierrot.

Par 3 fois, j'ai demandé à Shadow64 d'expliquer son problème.

Concernant la mise en forme du code, il a répondu en quelques minutes.

Par contre, pas un mot sur son problème, à part, aidez-moi à faire mon exercice.

J'attendais de lui, un truc du style,

y'a un problème avec i à la ligne 10

Ou au pie

Il ne se passe rien


Afin de pouvoir embrayer sur la syntaxe du for, que le,for exécute une seule instruction et sur le fait qu'une instruction s'écrit soit sur une ligne , soit sur plusieurs entre accolades.

Afin qu'il identifie de lui-même l'instruction vide exécutée n fois et donc i qui dépasse le tableau etc...

Et silence radio de sa part.

2 heures plus tard, [Dal] prend le parti de lui donner la solution à ce problème et de pointer les autres.

Et toujours aucune réactions.

Donc là, soit

  • on lui a donné la solution sur un autre forum entre temps et il n'est pas revenu ici,
  • il a pris tout ce que lui a donné[Dal] pour argent comptant, s'en est débrouillé et a oublié de dire merci,
  • son niveau et encore trop juste pour la permutation circulaire de l'alphabet et n'a pas osé demander plus d'explications.

Dans un cas comme dans l'autre, je ne pense pas qu'enfoncer le clou soit utile à ce stade.


0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 7 avril 2023 à 11:13

Bonjour Whismeril,

Tu as tout à fait raison sur le principe.

Afin de pouvoir embrayer sur la syntaxe du for, que le,for exécute une seule instruction et sur le fait qu'une instruction s'écrit soit sur une ligne , soit sur plusieurs entre accolades.

Afin qu'il identifie de lui-même l'instruction vide exécutée n fois et donc i qui dépasse le tableau etc...

Après, le problème est la mise en oeuvre pratique. Je ne pense pas que Shadow_74, qui a l'air très débutant, aurait été à même d'aboutir à ce résultat, à moins d'investir de part et d'autre plusieurs dizaines de messages avec lui, ou qu'il voit visuellement ce que fait son code avec le point virgule placé à cet endroit pour qu'il comprenne par lui même.

Dans ce cas, pointer l'OP (qui ne sait certainement pas utiliser un débogueur) vers un site de débogage visuel comme lui-là serait peut être utile avec ce genre de situation, avec lequel on voit tout de suite visuellement que le bloc entre accolades n'est pas répété (et est exécuté une seule fois et avec une valeur de i inappropriée, comme tu le dis), et on peut ensuite l'amener à se demander pourquoi son code se comporte comme cela pour l'amener à trouver le problème.

J'ai trouvé cependant que c'était beaucoup d'énergie à dépenser pour un ; en trop, alors que ce n'était pas, comme tu le sais (et de loin), le seul problème, et alors que si cela se trouve, Shadow_74 a juste tapé ce ; par inadvertance.

Je pense aussi que Shadow_74 ne doit pas être familier des forums, et que quand tu lui demandais d'expliquer son problème, il ne comprenait pas ce qu'il devait fournir comme type d'explications.

0
Utilisateur anonyme > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
7 avril 2023 à 13:10

Je ne voulais pas dire que je n'étais pas d'accord avec ta démarche.

Je pense aussi que shadow est très débutant et que chaque jour suffit sa peine, donc déjà la gestion  de l'alphabet circulaire est une chose, alors celle de la casse en plus et l'arithmétique des caractères que proposait Pierrot me paraissait trop dur pour le moment 

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1 > Utilisateur anonyme
7 avril 2023 à 18:24

Bonsoir,

Suis vraiment désolé pour mon silence je n'avais plus de forfait, suis encore désolé si ma demande vous un peu déranger je suis débutant et c'est ma première fois d'écrire dans la plateforme. Maintenant je suis à votre disposition 

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
7 avril 2023 à 11:27

@Shadow_74 :

Le principe de fonctionnement du forum est basé sur l'échange : tu expliques précisément la nature de ton problème et ta question, et on peut te guider pour que tu apprennes à régler ton problème.

Tu verras, d'ailleurs, que c'est souvent en faisant ce travail d'observation et de formulation du problème qui se manifeste, que tu fais les premiers pas vers son explication et sa résolution.

C'est ce type de démarche qu'on attend de toi.

Dans le même ordre d'idées, on t'invite à nous dire si ton, ou plutôt tes problèmes sont résolus, ou nous dire où tu en est, et, si tu as toujours des problèmes, de les expliquer.

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
7 avril 2023 à 18:25

Suis vraiment désolé pour mon silence excusé moi vraiment ????

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096 > Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023
7 avril 2023 à 18:34

Pas de souci Shadow_74,

on t'invite à nous dire si ton, ou plutôt tes problèmes sont résolus, ou nous dire où tu en est, et, si tu as toujours des problèmes, de les expliquer

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
7 avril 2023 à 18:41

Le programme a marché mais ça n'a pas crypté le message 


0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 11 avril 2023 à 16:37

Peux-tu reposter ton programme source tel qu'il est actuellement ?

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1 > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
Modifié le 11 avril 2023 à 16:38
#include <string.h>
#include<ctype.h>
int main()
{
    char message[] = {"JESUS EST SEIGNEUR"};
    char msg_crypte[100];
    long i;
    for (i = 0; i < strlen(message); i++) 
  {
     msg_crypte[i] = message[i] + 3;
  }
  printf("%s \n", message);
  printf("%s \n", msg_crypte);
return 0;
}

Maintenant ça passe, merci beaucoup pour votre aide, maintenant je dois faire en sorte que le message soit saisi après avoir compilé ( le programme doit me demander de saisir le message)

0
Utilisateur anonyme
7 avril 2023 à 18:56

As tu essayé le site de debogage visuel qu'a proposé [Dal] ?


0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
7 avril 2023 à 19:10

Oui oui .

Le code marche maintenant 

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
Modifié le 11 avril 2023 à 16:38
#include <string.h>
#include<ctype.h>
int main()
{
    char message[] = {"JESUS EST SEIGNEUR"};
    char msg_crypte[100];
    long i;
    for (i = 0; i < strlen(message); i++) ;
  {
     msg_crypte[i] = message[i] + 3;
  }
  printf("%s \n", message);
  printf("%s \n", msg_crypte);
return 0;
}

Maintenant ça marche j'avais oublié d'enlever le ; sur la ligne for 


0

Maintenant ça marche?
Change ta phrase pour  "Zorro aime crypter car il travaille pour Xfile"

Est-ce que 'Z', 'y'et 'X' sont codées comme des lettres?

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
Modifié le 11 avril 2023 à 16:39

Oui ça marche,

Non je n'ai pas codé ça comme des lettres.

Je n'arrive pas à faire en sorte que le message soit saisi au clavier par l'utilisateur, pour le moment je n'écris que dans le code source.

0
Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023 595 > Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023
Modifié le 11 avril 2023 à 16:39

Bonjour, 

Avec "Z" en input, on est à la fin de l'alphabet. Si tu décales de +1 tu tombes sur "[" selon https://www.asciitable.com/ or, tu dois avoir un "A".

Ce serait plus simple aussi s'il y avait que des majuscules (ou minuscules) à gérer

0
Utilisateur anonyme > Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023
Modifié le 11 avril 2023 à 16:40

Bonjour Grandasse.

Tout cela lui a déjà été dit, à plusieurs reprises. Si tu avais pris la peine de lire le sujet entier, tu l'aurais vu.

Actuellement nous sommes dans l'attente d'une proposition de code de la part Shadow pour ne chiffrer que les lettres minuscules, pas la ponctuation, ni les caractères spéciaux.

Quand il aura fait ça, on passera à la permutation circulaire (avec un décalage de 3, puis de n) et enfin la prise en compte des majuscules.

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096 > Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023
Modifié le 11 avril 2023 à 16:24

Salut Grandasse_,

Oui, c'est déjà ce qu'on disait à Shadow_74 plus haut, mais on y va progressivement dans la suite de la discussion.

A cet instant, ce qu'il essaye de faire c'est "si le caractère est une lettre on applique un décalage et si ce n'est pas une lettre, on le copie sans décalage", et cela se passe plus d'une vingtaine de messages après celui que tu as choisi de commenter.

(à partir de) là :

https://forums.commentcamarche.net/forum/affich-37825118-code-cesar-chiffre-et-dechiffrer-un-message-en-c?page=2#46

0
Utilisateur anonyme
8 avril 2023 à 07:10

Connais tu scanf ?


0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
8 avril 2023 à 07:14

Oui oui je connais ca 

0
Utilisateur anonyme
8 avril 2023 à 07:45

Et bien tu devrais arriver à faire saisir la phrase à chiffrer au clavier en l'utilisant.


0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
Modifié le 11 avril 2023 à 16:41
#include <string.h>
#include <ctype.h>

int main()
{
    char message[1000];
    printf("entrez le message: ");
    scanf("%s",message);
    char msg_crypte[100];
    long i;
    for (i = 0; i < strlen(message); i++) {
        msg_crypte[i] = message[i] + 3;
    }
    printf("%s \n", message);
    printf("%s \n", msg_crypte);
    return 0;
}

Ca passe maintenant mais si je mets l'espace entre le message le programme ne crypte que ce qui est écrit avant l'espace 


0
Utilisateur anonyme
8 avril 2023 à 09:39

Avant l'espace ?

Après plutôt. L'espace est effectivement pris comme séparateur pour scanf.

Connais tu gets ?


0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
8 avril 2023 à 10:35

Malheureusement je l'ignore en tout cas,

C'est quoi?


0
Utilisateur anonyme
8 avril 2023 à 11:07

mais si tu le n'as pas vu, il est possible que ton prof attend un seul mot à chiffrer

0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
8 avril 2023 à 14:58

Je l'ai vu j'ai aussi codé avec gets le programme a marché ????


0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
Modifié le 11 avril 2023 à 16:43
#include <string.h>
#include <ctype.h>

int main()
{
    char message[10000];
    printf("entrez le message: ");
    gets(message);

    char msg_crypte[10000];
    printf("msg_crypte: ");
    long i;
    for (i = 0; i < strlen(message); i++) {
       msg_crypte[i] = message[i] + 3;
    }
    printf("%s \n", msg_crypte);
    return 0;
}

Merci vraiment a tout le monde pour votre temps, j'ai beaucoup appris avec vous et merci pour votre manière d'aider qui pousse vraiment a travaillé surtout un débutant comme moi !.


0
Shadow_74 Messages postés 20 Date d'inscription jeudi 6 avril 2023 Statut Membre Dernière intervention 10 avril 2023 1
Modifié le 11 avril 2023 à 16:44
#include <string.h>
#include <ctype.h>

int main()
{
    char message[10000];
    printf("entrez le message: ");
    gets( message);

    char msg_crypte[10000];
    printf("msg_crypte: ");
    long i;
    for (i = 0; i < strlen(message); i++) {
        msg_crypte[i] = message[i] + 3;
    }
    printf("%s \n", msg_crypte);
    return 0;
}

Merci a tous pour cette aide,

Ecrire un programme C qui permet de crypté un message à l’aide du code César ,le programme va demander à l'utilisateur de saisir le message .


0
Utilisateur anonyme
8 avril 2023 à 18:26

Juste une confirmation, dans le titre, tu as écrit Chiffrer et Déchiffrer le code de César.

L'énoncé (ou le morceau d'énoncé ? ) que tu as ensuite posté ne parle que de chiffre.

Doit il y avoir aussi une étape de déchiffrage, si oui, tu ne l'as pas codée.

PS, attention à tes mots.

Crypter n'existe pas.

  • Chiffrer c'est rendre un texte"illisible" grâce à une clé et une méthode.
  • Déchiffrer, c'est l'inverse, donc rendre un texte chiffré lisible grâce à la clé et la méthode.
  • Décrypter, c'est essayer de rendre un texte chiffré lisible sans connaitre ni la clé ni la méthode.
  • Donc crypter devrait être l'inverse, c'est-à-dire rendre un texte illisible sans connaitre ni la clé ni la méthode, c'est donc un concept sans aucun sens. Du coup le mot n'existe pas.

Bien sûr, pour les gens "normaux" faire l'amalgame entre déchiffrer et décrypter, ce n'est pas grave, mais pour un codeur cela a son importance.

D'ailleurs, on dit "chiffre de César" plutôt que le code de César.


0