IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problèmes "scanf", critiques et conseils.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Par défaut Problèmes "scanf", critiques et conseils.
    Bonjour a tous,

    voila je poste car:

    -Je pensais que vous pourriez m'aider.

    -j'ai un problème, j'essaye de faire un petit programme qui crypte un message entrer par l'utilisateur et qui decrypte les messages mais mon problèmes n'est pas la. J'utilise la fonction scanf("%[^\n]s", chaine); mais elle ne fonctionne pas au moment de l'execution du programme.Je vous poste mon code plus bas.

    -j'aimerais avoir des critiques et des conseils, plus au niveau du code que de mon programme et et de son utilité.

    Voila mon code: (j'ai fait du mieux que j'ai pu pour le structurer...)
    Merci d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void cryptage();
    void decryptage();
     
    int main() {
    	int rep;
    	printf("Entrez le chiffre corespondant a votre choix:\n");
    	printf(" 1 . CRYPTAGE.\n");
    	printf(" 2 . DECRYPTAGE.\n");
    	scanf("%d", &rep);
     
    	switch(rep) {
    		case 1 :
    			cryptage();
    			break;
    		case 2 :
    			decryptage();
    			break;
    		default:
    			printf("Erreur de choix, relancer le programme.\n");
    	}
     
    system("pause");
    return 0;
    }
     
    void cryptage() {
    	char chaine[500];
    	int cle, nb_car, cod, i=0;
    	FILE* fichier_c = NULL; // fichier qui va contenir le message crypté.
     
    	fichier_c = fopen("Message.txt", "w");
    	fputs("Message:\n\n", fichier_c);
     
    	printf("Entrer le message a crypter:\n");
    	scanf("%[^\n]s", chaine); // c'est la que se situe mon problème.
    	do {
    	printf("Entrer la cle de cryptage: nombre positif < 256.\n");
    	scanf("%d", &cle);
    	} while((cle > 255) || (cle < 1));
     
    	nb_car = strlen(chaine);
    	fprintf(fichier_c, "%d", nb_car); /* J'inscris le nombre de caractères dans
    									  le fichier pour le connaitre au moment du
    									  decryptage (il me servira dans ma boucle
    									  de decryptage). */
    	while (i < nb_car) {
    		cod = chaine[i] ^ cle; // Je me sert du XOR pour trouver la valeur de cod.
    		fprintf(fichier_c, "%d ", cod);
    		i++;
    	}
     
    	fputs("//", fichier_c); // Ca ne sert à rien.
    	fclose(fichier_c);
    	printf("Fin du cryptage.\n");
    }
     
    void decryptage() {
    	int cle, nb_car, cod, decod, i=0;
    	FILE* fichier_c = NULL; // message crypté.
    	FILE* fichier_d = NULL; // message decrypté.
    	fichier_c = fopen("Message.txt", "r");
    	if (fichier_c == NULL) {
    		printf("Message crypte non trouve.\n");
    		printf("Fin du programme.\n");
    		system("pause");
    		exit(0);
    	}
    	fichier_d = fopen("Message_clair.txt", "w");
     
    	printf("Entrer la cle de decryptage:\n");
    	scanf("%d", &cle);
     
    	fputs("Message clair:\n\n", fichier_d);
    	fseek(fichier_c, 9, SEEK_SET); /* Le "curseur" se place dans le fichier a decrypté,
    								   la ou se trouve le nombre de caractères du message
    								   qui est suivi par le debut du message codé. */
    	fscanf(fichier_c, "%d", &nb_car);// nb_car prend le nombre de caractères.
     
    	while(i < nb_car) {
    		fscanf(fichier_c, "%d", &cod);
    		decod = cod ^ cle; // XOR pour retrouver le caractère de départ.
    		fprintf(fichier_d, "%c", decod);
    		i++;
    	}
    	printf("Fin du decryptage.\n");
     
    	fclose(fichier_c);
    	fclose(fichier_d);
    }

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Si tu ne fais que lire une chaine sur l'entrée standard, fgets() est plus approprié. Avec fgets(), ne pas oublier de vider l'entrée standard si la chaine saisie est trop longue

    http://man.developpez.com/man3/fgets.3.php

    http://c.developpez.com/faq/c/?page=...buffer_clavier

    http://xrenault.developpez.com/tutoriels/c/scanf/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Par défaut
    Merci pour ce conseil Gruik,

    je vais essayer cette autre methode.(et merci pour les liens).

    Savez pourquoi est ce que j'ai cette erreur?
    (j'ai oublié de preciser que je n'ai aucun message d'erreur, ni a la compilation, ni a l'execution du programme mais j'ai quand meme un probleme.
    (J'ai essayé sur visual c++ et sur gcc et je rencontre le meme probleme.)

    Auriez vous quand meme d'autres conseils a me donner? ou d'autres remarques a faire sur mon code?

    Merci a tous

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    +1 pour Gruik/fgets (ou, quand tu seras plus à l'aise, écrire une fonction qui lit une chaîne de longueur arbitraire dans un buffer réalloué dynamiquement au fur et à mesure de la lecture si le besoin s'en fait sentir)

    Sinon :
    - manque de gestion d'erreurs (pas de test des valeurs de retour des fonctions ni de valeurs renvoyées par tes fonctions) ;
    - inutile de mettre un commentaire pour dire qu'un truc ne sert à rien (si ça ne sert à rien : enlève-le) ;
    - noms de fichiers écrits en dur dans le code (au minimum, faire des #define au début ; au mieux, permettre à l'utilisateur de choisir) ;
    - quand tu fais un "fseek(fichier_c, 9, SEEK_SET);", on ne sait pas d'où vient ce 9 à moins de lire le reste du code (créer un " #define ENTETE_FICHIER_CHIFFRE "blablabla" " pour la chaîne concernée et remplacer le 9 par un "strlen(ENTETE_FICHIER_CHIFFRE)" ou quelque-chose du même genre) ;
    - on ne met pas un "exit(0);" en plein milieu d'une fonction (à moins que tu veuilles le cacher) ;
    - dans un cas d'erreur on écrirait plutôt "exit(1);" au lieu de "exit(0);" ;
    - de toutes façons on n'utilise de préférence une constante plutôt qu'une valeur numérique comme paramètre de exit(); ("exit(EXIT_SUCCESS);" ou "exit(EXIT_FAILURE);") ;
    - les commentaires délimités par "//", même si ils sont acceptés par ton compilateur, sont des commentaires C++, pas des commentaires C ;
    - utiliser un "int" pour un caractère paraît beaucoup (mais tu as le droit...c'est juste que le fichier chiffré serait plus petit si tu travaillais avec des caractères plutôt qu'avec la représentation décimale d'entiers) ;
    - le mot "cryptage" est un anglicisme (en français on dit "chiffrement")

    Je n'ai pas le courage de regarder plus que ça, désolé... (et bon courage )

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Par défaut
    Ecoute je crois que ça fait deja pas mal de truc a modifier
    bien que j'ai pas tous compris mais je vais relire ça attentivement.
    Merci beaucoup David.Schris.

    Et sinon est-ce que quelqu'un aurais quand meme une idée
    d'ou viens mon probleme? meme si je vais essayer la methode fgtets,
    j'aimerais quand meme savoir quel est le problèmes...

    et pour le FSEEK, le 9 c'est pasque je veux me placer
    9 caractères après le debut, vu que j'ai inscrit le mot "Message:"
    dans mon fichier. Message + ':' = 8 caractère donc jme place au 9ème
    c'est tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 21/02/2007, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo