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 :

Fonction remplacement


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Fonction remplacement
    Bonjour a tous, pour mon premier message sur le forum j'ai une petite (vraiment petite ) colle a vous posez qui me fait réfléchir depuis un petit moment déjà.
    Je voudrais créer une fonction qui remplace les lettres A --> B , B --> C
    (Le nombre de César en gros).
    J'ai donc voulu faire quelque chose du genre :
    "Entrez votre nombre de décalage" ( decalage = nombre de lettres a sauter)
    "Entrez votre expression"
    "Voici l'expression cryptée"

    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
    long crypt (int c)
    {
        c = getchar();
        if (c = 'A');
            putchar('B');
        else if ( c = 'B');
            putchar('C');
       ....
    }
     
    {
    char expression[100];
               expressionC = crypt(expression);
    scanf("%s", expression);
                    printf("Nous allons maintenant crypter votre expression : ");
                    printf("%d",expressionC);
    }
    Déjà cette fonction ne marche pas et je voudrais savoir si il y avait un moyen de ne pas se taper toutes les lettres une par une °°.

    J'ai essayé au maximum de réduire le code que j'ai mis pour pas faire un message trop long, mon code est déjà plus long que ca. C'est mon premier "vrai" programme et j'aimerais avoir des conseils de tous pour m'améliorer.
    Merci d'avance, je reste a dispositions pour des précisions que j'aurais a fournir si nécessaire.

  2. #2
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par MaxXxoui Voir le message

    long crypt (int c)
    {
    c = getchar();
    if (c = 'A');
    putchar('B');
    else if ( c = 'B');
    putchar('C');
    ....
    }

    {
    char expression[100];
    expressionC = crypt(expression);
    scanf("%s", expression);
    printf("Nous allons maintenant crypter votre expression : ");
    printf("%d",expressionC);
    }
    Une soluce rapide que je n'ai pas testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    long crypt (int c){
    char var = getchar();
    printf("%c\n", var + int);
     
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord merci pour ta réponse très rapide !
    Je n'ai cependant pas trop compris ce que représenter ton code, sachant que je suis encore un débutant. Pourrais tu me détaillé tout ca s'il te plait ?°°

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Comme tu as pu le remarque, il y a des problemes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    expressionC = crypt(expression);
    scanf("%s", expression);
    Tu demandes expression a l'utilisateur apres le cryptage...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    scanf("%s", expression);
    printf("Nous allons maintenant crypter votre expression : ");
    expressionC = crypt(expression);
    printf("%s",expressionC);
    semble plus logique tu crois pas?

    Concernant ta fonction de cryptage: getchar permet la saisie de caracteres, hors tu as deja saisie expression. Ce que tu veux c'est copier les lettres en les decalant une par une. Pour renvoyer une chaine de caractere en C c'est un peu complique, pour commencer le plus simple a mon avis est de passer un pointeur en parametre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void crypt(char* original, char* copie,  int decalage) {
        int i;
        for (i = 0; i < 100; i++)
            copie[i] = original[i] + decalage;
    }
    Et pour l'appeller comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    scanf("Expression: %s", expression);
    scanf("Decalage: %d", decalage);
    printf("Nous allons maintenant crypter votre expression : ");
    crypt(expression, expressionC, decalage);
    printf("%s",expressionC);
    Aussi, le formet pour une chaine de caractere c'est %s, pas %d.

    Attention tout de meme, le resultat depend de la table de caractere utilisee.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé de refaire mon programme mais je garde quelques bugs.
    Cependant comme je l'ai dis dans mon premier message je suis encore qu'un simple novice dans la programmation.
    Je vais continuer d'essayer de faire moi même ce programme mais je vais d'abord essayer de relire les cours du bouquin et quelques tutoriaux avant de vouloir me lancer dans les pointeurs et tout ...
    Merci quand même pour vos réponses, je vais garder vos idées pour améliorer le programme.
    Merci a tous et bon continuation, c'est vraiment un bon forum pour avoir une réponse si rapide

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    Citation Envoyé par MaxXxoui Voir le message
    J'ai essayé de refaire mon programme mais je garde quelques bugs. Cependant comme je l'ai dis dans mon premier message je suis encore qu'un simple novice dans la programmation.
    L'idée générale, en l'occurence, est que, pour un ordinateur, un caractère est toujours représenté par un nombre (code ASCII ou autre) qui correspond en fait à son numéro d'entrée dans une table. Un caractère « en lui-même » ne peut pas être codé en binaire. :-)

    Comme dans le code ASCII, et dans pratiquement toutes les autres formes de codage, les lettres sont représentées successivement et dans l'ordre de l'alphabet, il te suffit d'incrémenter le code de ce caractère pour passer à la lettre suivante. Il faut juste que tu vérifies que tu ne dépasses pas « Z », auquel cas tu reviens à « A ». Mieux encore : tu peux utiliser le modulo « % ».

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ouais je savais qu'on ne pouvais pas mettre un caractère dans un code comme ca mais je pensais que lorsqu'on mettait 'A' ça représentait tout de même le caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void crypt(char* original, char* copie,  int decalage) {
        int i;
        for (i = 0; i < 100; i++)
            copie[i] = original[i] + decalage;
    }
    Ce code me permettrait donc de faire la fonction ?
    Ce que je comprend pas c'est que içi on ne parle pas de l'expression qui est rentrée par l'utilisateur donc je vois pas comment on peut utiliser cela.
    A moins qu''il faudrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expressionC = crypt(expression)
    Ou expressionC représente l'expression cryptée que le programme va ressortir et expression, l'expression entrée par l'utilisateur ?
    (Si c'est cela, dois-je définir expressionC comme un tableau ou pas ?)
    (Ou encore est ce que je peux pas mettre tout simplement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s",crypt(expression)
    Merci pour vos réponses et vos détails

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par MaxXxoui Voir le message
    Ouais je savais qu'on ne pouvais pas mettre un caractère dans un code comme ca mais je pensais que lorsqu'on mettait 'A' ça représentait tout de même le caractère.
    C'est le cas. Un petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char lettre = 'A'; // lettre contient un nombre qui correspond a la lettre A dans la table de l'ordinateur
    lettre = lettre + 5; // lettre contient maintenant le code de la lettre 5 rang plus loin dans la table.
                                // en ASCII, c'est 'F'
    Citation Envoyé par MaxXxoui Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void crypt(char* original, char* copie,  int decalage) {
        int i;
        for (i = 0; i < 100; i++)
            copie[i] = original[i] + decalage;
    }
    Ce code me permettrait donc de faire la fonction ?
    Ce code EST la fonction Elle contient un bug car la chaine copie[] ne contient pas forcement de '\0' mais on verra ca plus tard.
    Citation Envoyé par MaxXxoui Voir le message
    Ce que je comprend pas c'est que içi on ne parle pas de l'expression qui est rentrée par l'utilisateur donc je vois pas comment on peut utiliser cela.
    On peut aussi l'ecrire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void crypt(char original[], char copie[],  int decalage)
    original[] et copie[] sont des variables locales a la fonction. Elles n'existent pas a l'exterieur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crypt(expression, expressionC, decalage);
    La fonction appellante (main dans ton cas) dit a la fonction crypt: "ta variable original vaut expression et ta variable copie vaut expressionC". C'est la qu'elles interviennent. La fonction crypt ne connait pas expression ni expressionC. Cela permet de reutiliser la fonction ailleurs. Un exemple: la meme fonction, appellees comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crypt(expressionC, expression, -decalage);
    decrypte expressionC

    Citation Envoyé par MaxXxoui Voir le message
    A moins qu''il faudrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expressionC = crypt(expression)
    Ou expressionC représente l'expression cryptée que le programme va ressortir et expression, l'expression entrée par l'utilisateur ?
    Ca marcherait si tu avais une fonction comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *crypt(char *original)
    Comme je t'ai dit plus haut, pour qu'une fonction renvoie une chaine de caractere de cette maniere c'est un peu complique pour l'instant (en tout cas plus que ce que je t'ai propose).

    Citation Envoyé par MaxXxoui Voir le message
    (Si c'est cela, dois-je définir expressionC comme un tableau ou pas ?)
    Dans tous les cas tu dois definit expressionC comme un tableau: une chaine est un tableau de caractere

    Citation Envoyé par MaxXxoui Voir le message
    (Ou encore est ce que je peux pas mettre tout simplement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s",crypt(expression)
    Dans ce cas la tu pourrais oui.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Malgré les aides de tonton fred, il me reste un bug dont je n'arrive pas a me débarrasser ! Je vous post ici mon 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    /* Ce programme est destiné a crypter un mot
    en fonction de différents algorythme de cryptage */
     
     
    void crypt(char* original, char* copie,  int decalage) {
        int i;
        for (i = 0; i < 100; i++)
            copie[i] = original[i] + decalage;
    }
     
     
    int main ()
    {
           int choixAlgo;
     
           printf("Bonjour,ce programme va permettre a l'utilisateur\n");
           printf("de crypter une expression suivant differents algorithme de cryptage\n");
           printf("Tout d'abord, veuillez choisir un mode cryptage pour votre expression\n");
           printf("1. Le chiffre de Cesar\n");
           printf("2. Blablabla\n");
           printf("3. Blablabla\n");
           printf("Quel est votre choix ? ");
           scanf ("%d", &choixAlgo);
           while (choixAlgo != 1 && choixAlgo != 2 && choixAlgo != 3)
               {
                printf("Taper un nombre entre 1 et 3 ! ");
                scanf("%d", &choixAlgo);
           }
           printf("\n");
     
           switch (choixAlgo)
           {
               int decalage, expressionC;
               char expression[100];
               case 1:
                    printf("Vous avez choisi le chiffre de Cesar\n");
                    printf("Ceci consiste a decaler les lettres de votre mot de n rangs vers droite\n");
                    printf("Choissez le decalage :  ");
                    scanf("%d", &decalage);
                    while (decalage != 1 && decalage != 2 && decalage != 3)
                    {
                        printf("Vous devez choisir un decalage entre 1 et 3 lettres : ");
                        scanf("%d", &decalage);
                    }
                    printf("Vous avez choisi un decalage de %d lettres\n",decalage);
                    printf("Veuillez ensuite entrer votre expression : \n");
                    scanf("Expression: %s", expression);
                    scanf("Decalage: %d", decalage);
                    printf("Nous allons maintenant crypter votre expression : ");
                    crypt(expression, expressionC, decalage);
                    printf("%s",expressionC);
     
     
     
     
     
     
                    break;
                case 2:
                    printf("Blablabla\n");
                    break;
                case 3:
                    printf("Blablabla\n");
                    break;
     
           }
     
     
           return 0;
    }
    Il reste encore beaucoup de modifications a apporter (notammment pour le décalage dont je voudrais qu'il ne soit pas que de 1,2,3 mais qu'on puisse mettre n'importe quel chiffre avec un modulo je pense) mais pour l'instant j'ai pas encore le niveau je crois et j'essaye déjà de regler ce probleme avec l'affichage de l'expression °°.
    Il me semble qu'après je n'aurais plus qu'a changer la boucle while et tout devrais marcher

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Petit up pour vous dire que j'ai trouvé une solution a mes problèmes mais malheuresment pas a tous ! Grace aux conseils de tonton fred mon programme me retourne maintenant ce que je veux (c'est a dire la lettre + le décalage)
    Neanmoins comme l'avais souligné tonton fred, il reste le problème du caractère de fin \0 et des espaces ainsi que de tous les caracteres qui ne sont pas des lettres (, . ; etc )
    J'ai donc vainement essaye de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void crypt(char* original, char* copie,  int decalage)
     {
        int i;
        if (i == '\0' || i == ' ')
            return " ";
        for (i = 0; i < 100; i++)
           copie[i] = original[i] + decalage;
    }
    Mais après avoir outrageusement biper, mon ordi plante le programme...
    Je me dis qu'il ne faut pas que j'utilise ' ' pour return et malgré de nombreux essais je n'arrive pas a trouver la solution de remplacement >.<
    Merci des vos aides !

    Je viens d'essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i=0;i < 'A' && i> 'Z';i++)
            return ' ';
    Sans plus de succès ...

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par MaxXxoui Voir le message
    Petit up pour vous dire que j'ai trouvé une solution a mes problèmes mais malheuresment pas a tous ! Grace aux conseils de tonton fred mon programme me retourne maintenant ce que je veux (c'est a dire la lettre + le décalage)
    Neanmoins comme l'avais souligné tonton fred, il reste le problème du caractère de fin \0 et des espaces ainsi que de tous les caracteres qui ne sont pas des lettres (, . ; etc )
    J'ai donc vainement essaye de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void crypt(char* original, char* copie,  int decalage)
     {
        int i;
        if (i == '\0' || i == ' ')
            return " ";
        for (i = 0; i < 100; i++)
           copie[i] = original[i] + decalage;
    }
    Mais après avoir outrageusement biper, mon ordi plante le programme...
    Je me dis qu'il ne faut pas que j'utilise ' ' pour return et malgré de nombreux essais je n'arrive pas a trouver la solution de remplacement >.<
    Merci des vos aides !

    Je viens d'essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i=0;i < 'A' && i> 'Z';i++)
            return ' ';
    Sans plus de succès ...
    Ce code n'a aucun sens.
    - i n'est pas initialisé. Je ne vois pas comment il pourrait valoir un caractère...
    - Pourquoi 100 ? Tu ne sais pas qu'une chaine est terminée par un 0 ?

    J'ai l'impression que tu ne sais pas ce que tu fais. Tu devrais commencer par définir clairement le but à atteindre.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ba mon but est que les caractères tels que les espaces, les virgules et autres soient ignorés par la fonction crypt.
    Il faut aussi que le dernière caractère de la chaîne \0 ne soit pas touché par la fonction crypt car affiché cela me met un code ignoble.
    J'ai cependant du mal a réaliser ce code.

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par MaxXxoui Voir le message
    Ba mon but est que les caractères tels que les espaces, les virgules et autres soient ignorés par la fonction crypt.
    Il faut aussi que le dernière caractère de la chaîne \0 ne soit pas touché par la fonction crypt car affiché cela me met un code ignoble.
    J'ai cependant du mal a réaliser ce code.
    Une boucle qui parcours une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char const s[] = "hello world";
    char *p = s;
     
    while (*p != 0)
    {
       p++;
    }
    ensuite dans la boucle, un filtre qui ne traite pas les caractères 'exclus':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (!isspace ((unsigned) *p) && ! ispunct((unsigned) *p))
    {
       /* traitement */
    }
    isspace() et ispunct() sont des fonctions déclarées dans <ctype.h>

    ou qui ne traite que les caractères demandés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (isalpha (*p))
    {
       /* traitement */
    }
    et les chiffres (isdigit()) ? a toi d'avoir une définition plus claire que "les caractères tels que les espaces, les virgules et autres soient ignorés par la fonction crypt" ... Parce que "et autres", je ne sais pas ce que ça veut dire...

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Voici le code que j'ai cru réussir a recréer a partir de tes indications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void crypt(char* original, char* copie,  int decalage)
     {
            char *p = original;
            while (*p != 0){
               p++;
               if (!isspace ((unsigned) *p) && ! ispunct((unsigned) *p))
               {
                        int i;
                        copie[i] = original[i] + decalage;
                }
                            }
     }
    Je ne vois toujours pas ou ce situe le problème.
    Au niveau des caractères spéciaux, je voudrais déjà réussir a avoir une expression correcte avant de me lancer dans un code plus compliqué ...

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par MaxXxoui Voir le message
    Voici le code que j'ai cru réussir a recréer a partir de tes indications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void crypt(char* original, char* copie,  int decalage)
     {
            char *p = original;
            while (*p != 0){
               p++;
               if (!isspace ((unsigned) *p) && ! ispunct((unsigned) *p))
               {
                        int i;
                        copie[i] = original[i] + decalage;
                }
                            }
     }
    Je ne vois toujours pas ou ce situe le problème.
    Au niveau des caractères spéciaux, je voudrais déjà réussir a avoir une expression correcte avant de me lancer dans un code plus compliqué
    Le p++; il faut le mettre à la fin de la boucle. C'est plus logique, non ? sinon, on ne traite pas le premier caractère et on teste le 0, ce qui est ... bizarre...

    Puisque tu veux faire une copie, il faut changer de stratégie et utiliser un indice plutôt qu'un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int i;
    for (i = 0; original[i] != 0; i++)
    {
       /* traitement */
    }
    ne pas oublier de copier le 0 final...

  16. #16
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Comme tu cherches a eviter les pointeurs, restons-en loin pour l'instant.

    On reprend:
    Pour copier en decalant il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for (i = 0; original[i] != '\0'; i++)
           copie[i] = original[i] + decalage;
    Cependant, seul les caracteres alphabetiques doivent etre decales, les autres doivent etre copies tels-quels (si tu les ignorent les phrases decryptees n'auront aucun sens).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (isalpha(orginal[i]))
          copie[i] = original[i] + decalage;
    else
          copie[i] = original[i];
    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i = 0; original[i] != '\0'; i++)
           if (isalpha(orginal[i]))
                 copie[i] = original[i] + decalage;
           else
                 copie[i] = original[i];
    Reste le probleme du '\0' final...
    La boucle sort lorsque original[i]=='\0' (donc ce qu'il y a a l'interieur de la boucle n'est pas execute). En particulier, on voudrait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (original[i] == '\0')
         copie[i] = '\0';
    Cependant, tester la valeur de original[i] n'est pas necessaire puisqu'on connait deja sa valeur. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (i = 0; original[i] != '\0'; i++)
           if (isalpha(orginal[i]))
                 copie[i] = original[i] + decalage;
           else
                 copie[i] = original[i];
    copie[i] = '\0';

Discussions similaires

  1. fonction remplace en vb.net
    Par dieudo dans le forum VB.NET
    Réponses: 3
    Dernier message: 28/02/2008, 11h41
  2. Fonction remplacer
    Par ANTMA dans le forum Excel
    Réponses: 2
    Dernier message: 07/12/2007, 16h40
  3. Fonction "Remplacer" Code VBA Access
    Par Lorenzole+bo dans le forum VBA Access
    Réponses: 6
    Dernier message: 27/09/2007, 21h17
  4. [vba E] fonction remplacer
    Par Bruno02 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/04/2007, 03h11
  5. Fonction remplace
    Par isamourgeo dans le forum Access
    Réponses: 3
    Dernier message: 15/03/2006, 20h48

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