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ème de switch-case ou de buffer ?


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème de switch-case ou de buffer ?
    Bonjour à tous,

    Je suis en train de faire un petit programme qui reorganise un fichiers (tabulation, commentaire ... etc).

    J'ai un fichier comme ça :

    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
     
    #include <stdio.h>
     
            /* Ce programme C ne fait pas grand chose */
     
    void main() {
       int n;
         char c;
     
           c = getchar(); /* on lit un caractere */ /* sur stdin */
     
    if (c==' ') { n++;putchar(c);}
         else /* sinon,
                 on ne fait rien */
          { ;}
    }
    Et je voudrais ca :

    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
     
    #include <stdio.h>
     
    /* Ce programme C ne fait pas grand chose */
     
    void main() {
            int n;
            char c;
     
            c = getchar(); /* on lit un caractere */ /* sur stdin */
     
            if (c==' ') { n++;putchar(c);}
    else /* sinon,
    on ne fait rien */
    {
             ;}
    }

    Or je ne comprends pas pourquoi au moment du retour à la ligne il ne reste pas dans l'etat ETAT_ACC puisque le retour à la ligne c'est bien un '\n'.
    Donc je me dis que ca peu venir d'un problème de buffer. J'ai donc rajouter un fflush(stdin) à la fin.
    Enfin je sais pas trop.

    Voila ce que ca me donne :

    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
     
    #include <stdio.h>
     
    /* Ce programme C ne fait pas grand chose */
     
    void main() {
            int n;
            char c;
     
    c = getchar(); /* on lit un caractere */ /* sur stdin */
     
    if (c==' ') { n++;putchar(c);}
    else /* sinon,
            on ne fait rien */
            { ;}
    }
    Et voilà 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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int 
    main()
    {
      int c;
      enum {ETAT_DBT_LIGNE, ETAT_NORMAL, ETAT_ACC} etat = ETAT_DBT_LIGNE;
     
      while ((c=getchar()) != EOF) {
        switch (etat) {
        case ETAT_DBT_LIGNE:
          switch (c) {
          case ' ':
    	case '\t':
    	  break;
          case '\n':
    	putchar(c);
    	break;
          case '{':
    	putchar(c);
    	etat = ETAT_ACC;
    	break;
          default:   
    	putchar(c);
    	etat = ETAT_NORMAL;
    	break;
          }
          break;
        case ETAT_NORMAL:
          switch (c) {
          case '\n': 
    	putchar(c);
    	etat = ETAT_DBT_LIGNE;
    	break;
          default :  
     
    	break;
          }    
        case ETAT_ACC:
          switch (c) {
          case '\n': 
    	putchar('\t');
    	break;
          case '}':
    	putchar(c);
    	etat = ETAT_DBT_LIGNE;
    	break;
          default :  
    	putchar(c);
    	break;
          }
     
        }
        fflush(stdin);
      }
      exit(EXIT_SUCCESS);
    }
    Merci de votre aide

    François

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je pense que tu t'es trompé avec ton code à la fin...

    Cela m'étonnerait qu'il fasse ce que tu veuille...

    Jc

    PS: void main ->
    int main ->

  3. #3
    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 : 67
    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 Gilouou
    Je suis en train de faire un petit programme qui reorganise un fichiers (tabulation, commentaire ... etc).
    J'ai absolument rien compris à la suite de la question. Si tu veux indenter automatiquement un source C, il y a des outils comme GNUIndent 1.9.1. Tu récupères les sources, tu le compiles et tu as un outil de mise en forme simple et efficace.

    http://emmanuel-delahaye.developpez....tm#indentation

    Si tu veux écrire ce genre de programme toi même, Lex & Yacc (Flex & Bison) sont tes amis...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 196
    Points : 202
    Points
    202
    Par défaut
    le programme qui reorganise dois avoir en parametre le fichier a reorganiser or je ne vois pas de programme qui prenne en parametre un fichier ....

    ou alors je me trompe et ne faite pas attention a ce que je dis

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Desole
    BOnjour,

    en effet je me suis trompe.

    Je viens d'editer mon message.

    E bien sur il existe des programmes qui le font déjà mais c'est pour m'entrainer au switch case.

    Merci de répondre si rapidemment.

    François

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si tu veux écrire ce genre de programme toi même, Lex & Yacc (Flex & Bison) sont tes amis...
    Entièrement d'accord.

    A remarquer que dans ce petit exemple, Lex tout seul devrait arriver à faire le travail tout seul avec une petite gestion d'état.

    Jc

  7. #7
    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 : 67
    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 Gilouou
    en effet je me suis trompe.

    Je viens d'editer mon message.
    OK. Tu peux déjà virer le fflush (stdin). C'est incorrect et inutile.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Il y a une chose que je ne trouve pas très belle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    enum {ETAT_DBT_LIGNE, ETAT_NORMAL, ETAT_ACC} etat = ETAT_DBT_LIGNE;
    Il vaudrait mieux en faire un type, puis l'utiliser en tant que tel, afin de gagner en clarté de code. Mais je pense que si ça compile, l'erreur ne doit pas venir de là.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  9. #9
    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 : 67
    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 InOCamlWeTrust
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    enum {ETAT_DBT_LIGNE, ETAT_NORMAL, ETAT_ACC} etat = ETAT_DBT_LIGNE;
    Il vaudrait mieux en faire un type, puis l'utiliser en tant que tel, afin de gagner en clarté de code.
    +1
    Ca fait un peu inachevé...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Problème avec Switch case
    Par Med_be dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 09/04/2011, 15h14
  2. Réponses: 3
    Dernier message: 30/07/2008, 10h21
  3. Problème de boucle Switch Case
    Par mLk92 dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2007, 17h20
  4. Problème switch case
    Par Nelmo dans le forum MFC
    Réponses: 8
    Dernier message: 04/05/2006, 15h17
  5. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37

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