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 :

Decalage de x lettres dans un texte


Sujet :

C

  1. #1
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut Decalage de x lettres dans un texte
    Bonjour a tous

    Bon, voila, je suis entrain de creer un petit programme permettant de crypter un simple texte en utilisant la methode de Caesar

    Pour l'instant, il affiche le texte contenu dans le fichier readme.txt
    Avant l'utilisateur choisi combien de lettres de decalages il y aura

    Mais apres je ne sais pas comment mettre en oeuvre ce decalage de x lettres

    Voici le code
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h> 
     
    void clean_stdin (void);
    void pause (int);
     
    int fgetc(FILE* pointeurDeFichier);
     
    int main(int argc, char *argv[])
    {
    	FILE* fichier = NULL;
     
    	int caractereActuel = 0;		
    	int decalage = 0;
    	int crypter = 0;
     
    	printf ("Decaler de combien de lettres ?\n\n");
    	scanf  ("%d", &decalage);
    	printf ("\n");
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		do
    		{
    			caractereActuel = fgetc(fichier); 
    			printf("%c", caractereActuel); 
    		}   
     
    		while (caractereActuel != EOF);
    		fclose(fichier);
    	}
    	else
    	{
    		system ("cls");
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    		return 0;
    	}
     
    	printf ("\n\nVoulez-vous vraiment crypter ce texte en utilisant un decalage de %d lettres ?\n\n", decalage);
    	printf ("Ecrivez 1 pour Oui ou 0 pour Non\n\n");
    	scanf  ("%d", &crypter);
     
    	if (crypter == 1)
    	{
    		system ("cls");
    		printf ("\nC'est parti xD\n\n");
     
    	}
    	else if (crypter == 0)
    	{
    		system ("cls");
    		printf ("`\nAu revoir, et bonne journée\n\n");
    		pause (1);
    		return 0;
    	}
    	else if (crypter < 0 || crypter > 1)
    	{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
     
    		while (crypter < 0 || crypter > 1)
    		{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
    		}
     
    		if (crypter == 1)
    		{
    			system ("cls");
    			printf ("\nC'est parti xD\n\n");
    		}
    		else if (crypter == 0)
    		{
    			system ("cls");
    			printf ("`\nAu revoir, et bonne journée\n\n");
    			pause (1);
    			return 0;
    		}
    	}	
     
     
    	system ("pause");   
        return 0;  
    }
     
    void clean_stdin (void) 
    {
        int c = 0;
        do
        {
          c = getchar();
        } while (c != '\n' && c != EOF);
    }
     
    void pause (int b)
    {
        printf ("\nAppuyez sur Entrer pour quitter\n");
        if (b==0)
            getchar ();
        else if (b==1)
        {
            clean_stdin ();
            getchar ();
        }
    }
    Merci de votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, je m'aiderais tu code ASCII de chacun des caractères

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    Ce n'est pas pour paraitre désagréable, mais si tu avais pris la peine ne serai ce qu'une seconde de lancer une recherche "cryptage cesar" dans la rubrique C, tu aurai eu en troisième résultat ceci :

    http://www.developpez.net/forums/d82...ilisant-cesar/


    maintenant, si tu as oublié, c'est pas grave, mais avant de faire un post, fais une recherche Google/Forum/Faq


    Si il y a des termes ou des points que tu ne comprends pas après recherche, n'hésite pas.

  4. #4
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    C'est vrai, j'ai oublié de chercher :/

    Sinon, sur le code que tu as posté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
        char Test[] = "aBcDeF";
     
        cesar_crypt(2, Test);
     
        printf("%s\n\n", Test);
     
        return EXIT_SUCCESS;
    }
    Est-il possible modifier la valeur du char Test[] par le texte affiché a l'ecran en utilisant la variable "caractereActuel" present dans mon code ?

    Sinon, je n'ai pas compris pourquoi dans un 2 apparait ??

    C'est a cause de cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0 ; i<strlen(texte) ; i++)
    Mais pourquoi i++ ?

    Sinon, merci de ton aide

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Citation Envoyé par Antoinejdu44 Voir le message

    Sinon, sur le code que tu as posté

    Est-il possible modifier la valeur du char Test[] par le texte affiché a l'ecran en utilisant la variable "caractereActuel" present dans mon code ?
    En fait, j'ai l'impression que caractereActuel te permet de recuperer un caractere d'un fichier et de l'afficher.
    Si tu procede comme ceci, et que tu ne retiens pas le caractere sortie, tu va avoir du mal a faire ton chiffrement.

    Je pense que tu devrait plutot extraire toutes la ligne de ton fichier grace a fgets et la stocker dans ma variable char texte[]



    Citation Envoyé par Antoinejdu44 Voir le message

    Sinon, je n'ai pas compris pourquoi dans un 2 apparait ??

    Sinon, merci de ton aide
    Si tu regarde le prototype de la fonction cesar_crypt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void cesar_crypt (int decallage, char *texte)
    En realité, le "2" indique que l'on veut faire un decallage de "2" cran vers l'avant : A->C

    Si j'avais mis -2 : A->Y

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0 ; i<strlen(texte) ; i++)
    Mais pourquoi i++ ?
    La boucle for se charge de parcourir la chaine de caractère "texte" lettre par lettre, d'ou le i++, sachant que i fait office d'indice et que strlen(texte) donne le nombre de lettre presente dans la chaine "texte".

  6. #6
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Okey, merci de ta reponse

    Je vais tester avec fgets

    Sinon, le 2 pour etre remplacé par une variable ? (Celle "decalage" ici )

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Oui, le deux peut etre remplacer par n'importe qu'elle valeur.

    Que ce soit une variable ou en dur, du moment que c'est un int, ca passe.

  8. #8
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Okey, merci

    Edit :

    J'ai mit le fgets, j'ai reussi a ce que le char prenne la valeur donnée par celui-ci, ma variable passe bien dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cesar_crypt(&decalage, Test);
    Mais rien ne se passe

    Voici le code complet

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_MAX 2000
     
    void clean_stdin (void);
    void pause (int);
     
    char* fgets(char* chaine, int nombreDeCaracteresALire, FILE* pointeurSurFichier);
     
    void cesar_crypt (int decallage, char *texte)
    {
    	int i;
        for(i=0 ; i<strlen(texte) ; i++)
     
            if ('a' <= texte[i] && texte[i] <= 'z')
                texte[i] = 'a' + ((texte[i] - 'a') + decallage)%26;
            else
                if ('A' <= texte[i] && texte[i] <= 'Z')
                    texte[i] = 'A' + ((texte[i] - 'A') + decallage)%26;
                else                
                    if ('0' <= texte[i] && texte[i] <= '9')
                        texte[i] = '0' + ((texte[i] - '0') + decallage)%26;
                    else                
                    {
                    }
    }
     
    void openfichier()
    {
    	FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
                printf("%s", chaine); 
            } 
            fclose(fichier);
     
    	}
    	else
    	{
    		system ("cls");
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    		return 0;
    	}
     
    }
     
    int main(int argc, char *argv[])
    {		
    	int decalage = 0;
    	int crypter = 0;
     
        char Test[] = "", chaine;
     
    	openfichier();	
     
    	printf ("\n\nDecaler de combien de lettres pour crypter ce texte ?\n\n");
    	scanf  ("%d", &decalage);
     
    	printf ("\n\nVoulez-vous vraiment crypter ce texte en utilisant un decalage de %d lettres ?\n\n", decalage);
    	printf ("Ecrivez 1 pour Oui ou 0 pour Non\n\n");
    	scanf  ("%d", &crypter);
     
    	if (crypter == 1)
    	{
    		system ("cls");
    		printf ("\nC'est parti xD\n\n");
     
    		cesar_crypt(&decalage, Test);
    		printf("%s\n\n", Test);
     
    		pause (1);
    		return 0;
     
     
    	}
    	else if (crypter == 0)
    	{
    		system ("cls");
    		printf ("`\nAu revoir, et bonne journée\n\n");
    		pause (1);
    		return 0;
    	}
    	else if (crypter < 0 || crypter > 1)
    	{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
     
    		while (crypter < 0 || crypter > 1)
    		{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
    		}
     
    		if (crypter == 1)
    		{
    			system ("cls");
    			printf ("\nC'est parti xD\n\n");
    		}
    		else if (crypter == 0)
    		{
    			system ("cls");
    			printf ("`\nAu revoir, et bonne journée\n\n");
    			pause (1);
    			return 0;
    		}
    	}	
     
     
    	system ("pause");   
        return 0;  
    }
     
    void clean_stdin (void) 
    {
        int c = 0;
        do
        {
          c = getchar();
        } while (c != '\n' && c != EOF);
    }
     
    void pause (int b)
    {
        printf ("\nAppuyez sur Entrer pour quitter\n");
        if (b==0)
            getchar ();
        else if (b==1)
        {
            clean_stdin ();
            getchar ();
        }
    }

  9. #9
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Tiens, c'est bizarre.

    Lorsque je fais un copier/Coller de ton code et que je compile, Antivir s'affole et me signal une tonne de chaeval de troie ... Qu'essaye tu de faire, jeune padawan ?

    Bon, blague a part, faudrai comprendre pourquoi ca arrive.

    Donc, deja le truc drôle, c'est le return 0; dans une fonction void

    Ensuite, j'ai l'impressions que tu espere que le programme comprendra ce que tu as essayer de faire. Seul probleme, l'ordi es bete et mechant, il fera ce que tu lui demandera.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void openfichier()
    {
        ....
        char chaine[TAILLE_MAX] = "";
        ....
        while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
        ....
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char *argv[])
    {
        ....
        char Test[] = "", chaine;
     
        openfichier();
    }
    En aucun cas la variable chaine du main sera assimiler a la variable chaine de openfichier.

    Ta fonction openfichier ouvre un fichier, utilise une variable local (ce qui signiife qu'elle n'existe pas en dehors openfichier) nommé chaine, lui affecte au fur et a mesure les ligne du fichier et les affiche.


    Ton gros probleme est donc que tu crois remplir correctement chaine[] mais que nenni.
    Il faut donc, soit que tu passe "chaine" de main par argument, soit tu retourne le tableau chaine. C'est l'un ou l'autre.

  10. #10
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Okey, merci de ta reponse

    Sinon, pour le cheval de Troie, ni Avast!, ni Ad-Watch me trouve quelque chose :/

    Pourquoi, tu trouves drole le return0; dans le void ?
    Il ne sert a rien ?

    Sinon, pourrais-tu me montrer comment faire pour

    Il faut donc, soit que tu passe "chaine" de main par argument, soit tu retourne le tableau chaine. C'est l'un ou l'autre.
    Car, je debute C, (sa doit faire que 2-3 semaines que je le tate )

    Merci

  11. #11
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Citation Envoyé par Antoinejdu44 Voir le message

    Pourquoi, tu trouves drole le return0; dans le void ?
    Il ne sert a rien ?
    Et bien, void est un type pour signifier "rien".

    C'est a dire qu'une fonction qui retourn void veut dire que c'est une fonction qui retourne "rien".


    Or, dans une fonction void, toi tu retourne un int. Tu retourne donc quelque chose dans une fonction qui ne retourne rien

    En clair, si une fonction retourne un int, tu dois retourner un int, si elle retourne un char, tu dois retourner un char.

    Si elle retourne void, tu ne dois "rien" retourner.

    Autrement dit, un return avec void s'ecrit "return ;"





    Citation Envoyé par Antoinejdu44 Voir le message

    Sinon, pourrais-tu me montrer comment faire pour

    Car, je debute C, (sa doit faire que 2-3 semaines que je le tate )

    Merci
    Oui, pas de probleme, mais n'essayerai tu pas de mettre la charue avant les boeufs ?

    Je suis daccord pour dire qu'on maitrise un langage en le pratiquant, mais faudrait voir a faire un peu de theorie aussi !
    Quand je dis un peu, je veux dire en realité qu'il faut faire la theorie jusqu'au bout. Le langage C est un des langage de plus bas niveau chez les langage de haut niveau.

    Il ne s'invente pas, il s'apprend.

    Voici le code :


    Par return :
    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
     
    char* openfichier()
    {
    	FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
                printf("%s", chaine); 
            } 
            fclose(fichier);
     
    	}
    	else
    	{
    		system ("cls");
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    		return NULL;
    	}
     
            return chaine;
     
    }
     
    int main(int argc, char *argv[])
    {		
     
        char Test[] = openfichier();
    }

    Par passage par argument :
    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
     
    void openfichier(char *chaine)
    {
    	FILE* fichier = NULL;
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
                printf("%s", chaine); 
            } 
            fclose(fichier);
     
    	}
    	else
    	{
    		system ("cls");
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    	}
    }
     
    int main(int argc, char *argv[])
    {		
     
        char Test[] = "";
        openfichier(Test);
    }

    Voila, je l'ai fait de tete, mais ca ressemble a ca.

    Autre chose :

    Ta gestion des erreurs sur l'ouverture est incomplete. En cas de probleme, il faudrait afficher le message d'erreur automatiquement generer par fopen avec perror(). je te conseille cependant de plutot regarder les base avant, puis de te pencher dessus.


    Bon courage pour la suite

  12. #12
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    OKey, merci

    T'inquiete pas, je compte bien l'apprendre en theorie
    Je me dis qu'en me lancant des projets complexes, je vais avoir besoins de beaucoup de connaissances, donc je vais devoir apprendre pas mal

    Là, je n'ai fait que le crypter, apres j'integre un menu avec la possibilé de decrypter

    Edit : Dans mon code, je n'ai aucune erreur, pourtant, j'ai un probleme
    J'ai mis "test" dans mon fichier readme.txt, c'est affiché correctement au debut, mais apres sa affiche des caractères bizarres, et sa ecrit U dans le fichier .txt

    Voici mon code

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_MAX 2000
     
    void clean_stdin (void);
    void pause (int);
     
    char* fgets(char* chaine, int nombreDeCaracteresALire, FILE* pointeurSurFichier);
     
    void cesar_crypt (int decallage, char *texte)
    {
    	int i;
        for(i=0 ; i<strlen(texte) ; i++)
     
            if ('a' <= texte[i] && texte[i] <= 'z')
                texte[i] = 'a' + ((texte[i] - 'a') + decallage)%26;
            else
                if ('A' <= texte[i] && texte[i] <= 'Z')
                    texte[i] = 'A' + ((texte[i] - 'A') + decallage)%26;
                else                
                    if ('0' <= texte[i] && texte[i] <= '9')
                        texte[i] = '0' + ((texte[i] - '0') + decallage)%26;
                    else                
                    {
                    }
    }
     
    char* openfichier()
    {
    	FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
                printf("%s", chaine); 
            } 
            fclose(fichier);
     
    	}
    	else
    	{
    		system ("cls");
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    		return NULL;
    	}
     
    	return chaine;
    }
     
    void ecrire()
    {
    	FILE* fichier = NULL;
    	int ecrire = openfichier;
     
        fichier = fopen("readme.txt", "w");
     
        if (fichier != NULL)
        {
           fprintf(fichier, "%c", ecrire);
           fclose(fichier);
     
        }
     
        return 0;
    }
     
    int main(int argc, char *argv[])
    {		
    	int decalage = 0;
    	int crypter = 0;
     
    	char Test[] = {openfichier()};
     
    	printf ("\n\nDecaler de combien de lettres pour crypter ce texte ?\n\n");
    	scanf  ("%d", &decalage);
     
    	printf ("\n\nVoulez-vous vraiment crypter ce texte en utilisant un decalage de %d lettres ?\n\n", decalage);
    	printf ("Ecrivez 1 pour Oui ou 0 pour Non\n\n");
    	scanf  ("%d", &crypter);
     
    	if (crypter == 1)
    	{
    		system ("cls");
    		printf ("\nC'est parti xD\n\n");
     
    		cesar_crypt(&decalage, Test);
    		printf("%s\n\n", Test);
     
    		ecrire();
     
    		pause (1);
    		return 0;
     
     
    	}
    	else if (crypter == 0)
    	{
    		system ("cls");
    		printf ("`\nAu revoir, et bonne journée\n\n");
    		pause (1);
    		return 0;
    	}
    	else if (crypter < 0 || crypter > 1)
    	{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
     
    		while (crypter < 0 || crypter > 1)
    		{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
    		}
     
    		if (crypter == 1)
    		{
    			system ("cls");
    			printf ("\nC'est parti xD\n\n");
    		}
    		else if (crypter == 0)
    		{
    			system ("cls");
    			printf ("`\nAu revoir, et bonne journée\n\n");
    			pause (1);
    			return 0;
    		}
    	}	
     
     
    	system ("pause");   
        return 0;  
    }
     
    void clean_stdin (void) 
    {
        int c = 0;
        do
        {
          c = getchar();
        } while (c != '\n' && c != EOF);
    }
     
    void pause (int b)
    {
        printf ("\nAppuyez sur Entrer pour quitter\n");
        if (b==0)
            getchar ();
        else if (b==1)
        {
            clean_stdin ();
            getchar ();
        }
    }
    Images attachées Images attachées  

  13. #13
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Déjà en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ('a' <= texte[i] && texte[i] <= 'z')
    Tu supposes que les codes attribués aux caractères sont ordonnés selon leur ordre alphabétique, comme en ASCII, donc ton programme ne fonctionnera que sur des systèmes utilisant l'ASCII ou un code dérivé pour représenter les caractères. C'est le cas des systèmes DOS/Windows et Linux, mais pas celui des systèmes pour les mainframes IBM par exemple. Il y a des fonctions/macros portables dans ctype.h qui permettent de déterminer le "type" d'un caractère :
    - isalpha permet de connaître si c'est une lettre (a-z ou A-Z)
    - islower permet de connaître si c'est une lettre minuscule
    - isupper permet de connaître si c'est une lettre majuscule
    - isalnum permet de connaître si c'est un caractère alphanumérique (lettre ou chiffre).
    - etc.

    Ensuite avec :
    Tu condamnes tout simplement le programme pour DOS/Windows (à moins qui'il existe aussi d'autres systèmes reconnaissant cette commande).

    Quant à :
    char* fgets(char* chaine, int nombreDeCaracteresALire, FILE* pointeurSurFichier);
    Je n'ai absolument pas compris ce à quoi tu voulais en venir avec. fgets est déjà déclarée dans stdio.h, pourquoi la déclarer une fois de plus ?

    Edit : Dans mon code, je n'ai aucune erreur, pourtant, j'ai un probleme
    Tu n'as pas d'erreur de syntaxe, mais tu as bel et bien une erreur (de programmation), puisque ton programme fait n'importe quoi.

    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    if ('0' <= texte[i] && texte[i] <= '9')
                        texte[i] = '0' + ((texte[i] - '0') + decallage)%26;
    Il n'y a pas 26 chiffres, seulement 10. Et remplacer le test par if (isdigit(...)), bien qu'ici ça ne soit pas vraiment grave.

    2. Dans la fonction openfichier, tu fais une boucle avec fgets mais tu écrase à chaque fois l'ancienne chaîne lue. Il faudra un peu de strcat quelque part ...

    En plus tu retournes l'adresse d'une variable locale (chaine), ce qui ne ce fait pas. Ajoute static devant chaine.

    3. Dans la fonction ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ecrire = openfichier;
    Utilisation d'une variable de même nom qu'une fonction qui existe déjà, ce n'est pas trop conseiller. En plus la syntaxe d'appel à la fonction est incorrecte, la bonne syntaxe est openfichier(). Mais de toute façon, openfichier retourne un char *, pourquoi tu stockes ça valeur de retour dans un int ? Et si ce n'est pas un appel, openfichier est une fonction, affecter openfichier à une variable de type int me semble très louche ...

    4. Dans écrire : Même remarque que pour 3 plus : une fonction void ne doit pas retourner de valeur.

    5. Dans main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Test[] = {openfichier()};
    openfichier() retourne un char *, initialiser Test[0] avec cette valeur est également louche ... Voici comment initialiser un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cesar_crypt(&decalage, Test);
    Le premier argument requis par cesar_crypt est de type entier et non adresse d'un entier.

    Il faut que tu fasses toutes les modifications nécessaires avant qu'on puisse continuer.

  14. #14
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Wahou

    Merci de ton aide, je vais taffer cela demain, c'est trop tard pour ce soir

  15. #15
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    J'ai essaye de resoudre les points de 1 à 4

    Pour le 1 : Je ne souhaite crypter que du texte, donc, j'ai supprimer ces 2 lignes de code

    Pour le 2 : J'ai rajouter un strcat, mais je ne sais pas si il est au bon endroit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
    			strcat(str, "", chaine);
                printf("%s", chaine); 
    	    } 
            fclose(fichier);
    J'ai aussi rajouter static devant chaine, mais j'ai une erreur de synthaxe

    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
    char* openfichier()
    {
    	char str[3000];
     
    	FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
    			strcat(str, "", chaine);
                printf("%s", chaine); 
    	    } 
            fclose(fichier);
     
    	}
    	else
    	{
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    		return NULL;
    	}	
     
    	return static chaine;
    }
    error C2143: erreur de syntaxe*: absence de ';' avant 'type'
    Pour le 3 : J'ai remplacer le openfichier par chaine

    mais là aussi j'ai une erreur

    error C2065: 'chaine'*: identificateur non déclaré
    POur le 4 : J'ai rajouter

    Voici le code complet

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
     
    #define TAILLE_MAX 2000
     
    void clean_stdin (void);
    void pause (int);
     
    char *strcat(char *destination, const char *origine); 
     
    char* openfichier()
    {
    	char str[3000];
     
    	FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("readme.txt", "r");
     
    	if (fichier != NULL)
    	{
    		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
            {
    			strcat(str, "", chaine);
                printf("%s", chaine); 
    	    } 
            fclose(fichier);
     
    	}
    	else
    	{
    		printf("\nImpossible d'ouvrir le fichier readme.txt\n\n");
    		pause (1);
    		return NULL;
    	}	
     
    	return static chaine;
    }
     
    void ecrire()
    {
    	FILE* fichier = NULL;
    	int ecrire = chaine;
     
        fichier = fopen("readme.txt", "w");
     
        if (fichier != NULL)
        {
           fprintf(fichier, "%c", ecrire);
           fclose(fichier);
     
        } 
        return NULL;
    }
     
    void cesar_crypt (int decallage, char *texte)
    {
        int i;
        for(i=0 ; i<strlen(texte) ; i++)
     
            if ('a' <= texte[i] && texte[i] <= 'z')
                texte[i] = 'a' + ((texte[i] - 'a') + decallage)%26;
            else
     
                if ('A' <= texte[i] && texte[i] <= 'Z')
                    texte[i] = 'A' + ((texte[i] - 'A') + decallage)%26;
                else              
                    {
                    }
    }
     
    int main(int argc, char *argv[])
    {		
    	int decalage = 0;
    	int crypter = 0;
     
    	openfichier();
     
    	printf ("\n\nUtiliser un decallage de combien de lettres pour crypter ce fichier ?\n\n");
    	scanf  ("%d", &decalage);
     
    	printf ("\n\nVoulez-vous vraiment crypter ce texte en utilisant un decalage de %d lettres ?\n\n", decalage);
    	printf ("Ecrivez 1 pour Oui ou 0 pour Non\n\n");
    	scanf  ("%d", &crypter);
     
    	if (crypter == 1)
    	{
    		system ("cls");
    		printf ("\nC'est parti xD\n\n");
     
    	    printf ("\nTexte crypte, avec un decallage de %d lettres, disponible a la fin du fichier \nreadme.txt situe a la racine du logiciel \n\n", decalage);
     
    		pause (1);
    		return 0;
     
     
    	}
    	else if (crypter == 0)
    	{
    		system ("cls");
    		printf ("`\nAu revoir, et bonne journée\n\n");
    		pause (1);
    		return 0;
    	}
    	else if (crypter < 0 || crypter > 1)
    	{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
     
    		while (crypter < 0 || crypter > 1)
    		{
    		printf ("\nVeuillez entrer 0 ou 1\n\n");
    		scanf ("%d", &crypter);
    		}
     
    		if (crypter == 1)
    		{
    			system ("cls");
    			printf ("\nC'est parti xD\n\n");
    		}
    		else if (crypter == 0)
    		{
    			system ("cls");
    			printf ("`\nAu revoir, et bonne journée\n\n");
    			pause (1);
    			return 0;
    		}
    	}	
     
     
    	system ("pause");   
        return 0;  
    }
     
    void clean_stdin (void) 
    {
        int c = 0;
        do
        {
          c = getchar();
        } while (c != '\n' && c != EOF);
    }
     
    void pause (int b)
    {
        printf ("\nAppuyez sur Entrer pour quitter\n");
        if (b==0)
            getchar ();
        else if (b==1)
        {
            clean_stdin ();
            getchar ();
        }
    }

  16. #16
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ecrire()
    {
    	FILE* fichier = NULL;
    	int ecrire = chaine;
    chaine n'a jamais été declarer, c'est normal qu'il te mette une erreur.
    Il faut, soit recuper/initialiser cette variable avant initialisation
    soit recuperer cette variable par parametre

  17. #17
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    POur l'instant, je vais laisser tomber la fonction ecrire, j'aimerai afficher le resultat mais je n'arrive pas resoudre le 5 dans le message de Melem

  18. #18
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *strcat(char *destination, const char *origine);
    strcat est déjà déclarée ans string.h. Inutile de la déclarer une fois de plus. Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(str, "", chaine);
    strcat ne prend pas 3 arguments.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* openfichier()
    {
        char str[3000];
        ...
        return static chaine;
    }
    C'est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* openfichier()
    {
        static char str[3000];
        ...
        return str;
    }
    POur l'instant, je vais laisser tomber la fonction ecrire
    Et la prochaine fois, rieviens-nous avec une fonction ecrire qui prend la chaine a écrire en paramètre, chaîne qu'elle passera a cesar_crypt avant d'écrire dans le fichier.

    j'aimerai afficher le resultat mais je n'arrive pas resoudre le 5 dans le message de Melem
    Alors apprends à utiliser les tableaux.

  19. #19
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Merci

    Juste une petite verification

    Tu dis que strcat ne prend que 2 arguments, sa serait donc
    a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(str, "", chaine);
    ?

  20. #20
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    T'as tout compris . Mais str doit être initialisé à "" (chaîne vide) avant de l'utiliser. T'as suivi le lien que je t'ai donné ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Programme indiquant la fréquence de lettre dans un texte ?
    Par programeurdebutant dans le forum Général Java
    Réponses: 4
    Dernier message: 09/12/2013, 20h17
  2. Compter nombre de répétitions d'une lettre dans un texte saisi
    Par tabrouri2000 dans le forum Général Java
    Réponses: 2
    Dernier message: 09/07/2011, 02h10
  3. Saisir que des lettres dans une zone de texte
    Par parab dans le forum IHM
    Réponses: 2
    Dernier message: 03/12/2008, 14h52
  4. nombre de répitation d'une lettre dans un texte
    Par awax dans le forum Delphi
    Réponses: 5
    Dernier message: 15/08/2006, 19h31

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