langage C
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

langage C



  1. #1
    invite466d2360

    langage C


    ------

    Bonjour à tous,
    J'ai un problème avec cet exercice sur le langage C....

    Ecrivez un programme qui vérifie si des identifiants sont valides, c'est à dire qu'ils peuvent être utilisés comme noms de variables ou de fonctions en langage C. On ne tiendra pas compte des éventuels mots clés, qui seront donc considérés comme des identifiants valides.

    Vous pouvez utiliser les fonctions de la bibliothèque standard, dont les prototypes se trouvent dans le fichier ctype.h. En voici quelques unes :

    int isalnum(int c); : Teste si le caractère est alphanumérique (lettre majuscule, minuscule ou chiffre).
    int isalpha(int c); : Teste si le caractère est une lettre majuscule ou une minuscule.
    int iscntrl(int c); : Teste si le caractère est un caractère de contrôle.
    int isdigit(int c); : Teste si le caractère est un chiffre.
    int islower(int c); : Teste si le caractère est une lettre minuscule.
    int isupper(int c); : Teste si le caractère est une lettre majuscule.

    Chacune de ces fonctions retourne 0 (faux) si le caractère n'est pas du type testé et une valeur non nulle (vrai) sinon.
    On rappelle qu'un identifiant en langage C doit commencer par une lettre non accentuée ou un caractère '_', et que chacune des lettres suivantes est soit une lettre non accentuée, soit un '_', soit un chiffre.

    Mon programme:
    Code:
    #include <stdio.h>
    #include <ctype.h>
    
    int main () {
    
    int N,i,j,novalid;
    char c;
    
    scanf("%d",&N);
    
    for (i=1; i <= N; i++)
    {
      scanf("%c",&c);
      novalid=0;
      j=1;
      
      while (c != '\n' ) 
      {
        if(j==1){
           if (isalpha((int)c) == 0 && c != '_') novalid++ ;
        } 
        else {
           if (isalnum((int)c) == 0 && c != '_') novalid++;
        }
        
        j++ ;
         scanf("%c",&c);
      }
       if (novalid == 0) printf("YES\n");
       else printf("NO\n");
    
    
    }
    return 0;
    }
    Les identifiants choisis dans l'exemple sont pour N=5 :
    Bonjour32
    réussi
    _toto_
    passe-partout
    2_fois

    J'obtiens:
    La réponse donnée par votre programme est incorrecte.
    Il a affiché :

    YES
    YES
    NO
    YES
    NO

    au lieu de :

    YES
    NO
    YES
    NO
    NO


    D'avance je vous remercie...
    Bien cordialement et joyeuses fêtes
    Mägodeoz

    -----

  2. #2
    Jack
    Modérateur

    Re : langage C

    Le problème est classique et vient de la ligne:

    scanf("%c",&c);

    Il faut "purger" le buffer attaché à stdin. Il y a une solution simple sous windows, mais non standard: avant ce scanf, tu ajoutes la ligne
    fflush(stdin);
    Ainsi, le caractère de saut de ligne qui était resté mémorisé dans le buffer clavier suite à l'entrée du nombre d'identifiants à tester va être supprimé.

    Le problème de la saisie au clavier n'est pas trivial en C. Il y a un excellent article dans la faq de developpez.com.

    A+
    Dernière modification par Jack ; 24/12/2011 à 17h40.

  3. #3
    invite466d2360

    Re : langage C

    Merci de votre réponse....
    Je ne comprends pas. Le problème de mon programme semble venir de cette partie là non?

    Code:
      while (c != '\n' ) 
      {
        if(j==1){
           if (isalpha((int)c) == 0 && c != '_') novalid++ ;
        } 
        else {
           if (isalnum((int)c) == 0 && c != '_') novalid++;
        }
        
        j++ ;
         scanf("%c",&c);
      }
    Puisque je ne trouve pas les bonnes réponses....
    En quoi le scanf fausse le résultat?

  4. #4
    Jack
    Modérateur

    Re : langage C

    tu as essayé?

    Pour l'explication, je l'ai donnée dans mon message précédent.
    Je te conseille d'essayer de faire du pas à pas avec ton debugger et tu verras qu'il ne te demandera pas d'entrer le 1er caractère car le retour ligne est encore dans le buffer.

    A+
    Dernière modification par Jack ; 24/12/2011 à 18h01.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : langage C


  7. #6
    invite466d2360

    Re : langage C

    J'ai essayé de rajouté fflush(stdin); devant les 2 scanf("%c",&c); aucun changement...ça me laisse
    YES
    YES
    NO
    YES
    NO

    au lieu de :

    YES
    NO
    YES
    NO
    NO

  8. #7
    invite4492c379

    Re : langage C

    Hello,

    tu te compliques la vie je trouve. Pourquoi lire caractère par caractère ? Lit une chaine, vérifie que le premier caractère est valide mais n'est pas un chiffre et que tous les autres caractères sont des caractères valides. Suis également le conseil de Jacck : utilises le debugger pour comprendre où se situe ton erreur ...

  9. #8
    invite466d2360

    Re : langage C

    Merci de votre réponse. Je suis assez novice en programmation.ça fait juste 3 mois que je fais du C. ^^ En fait je m'entraîne actuellement sur France-IOI si vous connaissez et il n'y a pas de debugger.... Comment lit-on une chaîne de caractère?....
    Execution et compilation c'est le site qui le fait en fait...

  10. #9
    invite4492c379

    Re : langage C

    Bon, si j'étais toi je commencerais par installer un environnement de développement sur ton PC et je me lancerais dans la lecture de tutoriels. Le site que t'a donné Jack est excellent.

  11. #10
    invite466d2360

    Re : langage C

    Je vais suivre votre conseil...ça sera plus simple pour moi ^^
    Mais sinon concernant mon programme, si je fais caractère par caractère, à votre avis où est le problème? Je pensais que l'erreur était peut-être le contenu de isalpha et isalnum qui peut-être contiennent "-" ou les minuscules avec accents"?
    Quand vous dites lire une chaine de caractère, c'est quand on a %s dans le scan c'est ça?

  12. #11
    invite765732342432
    Invité

    Re : langage C

    Pour ne pas s'embêter avec les scanf (fonction source de nombreuses galères pour tout le monde), il faut prendre le problème proprement:
    Tout d'abord, créée une fonction qui teste si une chaine de caractère (char *) est un identifiant correct.
    Ensuite, dans le main, tu commences par tester ta fonction directement en écrivant à la suite:
    if (ma_fonction("Bonjour32")) printf("YES\n"); else printf("NO\n");
    if (ma_fonction("réussi")) printf("YES\n"); else printf("NO\n");
    if (ma_fonction("_toto_")) printf("YES\n"); else printf("NO\n");
    if (ma_fonction("passe-partout")) printf("YES\n"); else printf("NO\n");
    if (ma_fonction("2_fois")) printf("YES\n"); else printf("NO\n");

    Une fois que cela marchera, tu pourras te casser la tête avec scanf...

    Bon courage !

Discussions similaires

  1. langage C
    Par invitead51e543 dans le forum Électronique
    Réponses: 20
    Dernier message: 08/06/2010, 23h42
  2. de langage C en langage assembleur
    Par invite284746c1 dans le forum Électronique
    Réponses: 1
    Dernier message: 14/05/2009, 13h42
  3. Langage C
    Par invitee6cf0735 dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 01/05/2009, 16h27
  4. langage
    Par invite600d9261 dans le forum Psychologies (archives)
    Réponses: 6
    Dernier message: 04/04/2009, 12h05