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 :

Un mot par ligne


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut Un mot par ligne
    Alors je continue dans mon élan !

    J'aimerais faire un programme qui affiche un mot par ligne. Mais attention s'il y a deux espaces, il ne faut pas qu'il y est une ligne vide entre ces deux mots.
    Pour l'instant j'ai créée le pg suivant :

    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
    #include <stdio.h>
     
    #define IN 1 /* en una palabra*/
    #define OUT 0  /*fuera de una palabra*/
     
    main()
    {
        int state;
        int c;
     
        state = IN;
     
        while ((c = getchar()) != EOF)
        {
     
            if (c == ' '|| c == '\t')
     
                if (state == IN)
                {
                    state = OUT;
                    c = '\n';
                }
            else
            {
                state = IN;
            }
     
            putchar(c);
        }
    }
    Ca marche... mais une fois sur deux, et je ne comprends pas pq !
    Je ne cherche pas à réussir spécialement cet exercice, mais juste à comprendre mon erreur. Quelqu'un a vu où elle était ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Regarde bien le déroulement de cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (state == IN)
    {
    state = OUT;
    c = '\n';
    }
    else
    {
    state = IN;
    }
    On voit que :
    Si "state" est égal à IN, alors "state" devient OUT.
    Si "state" est égal à OUT, alors "state" devient IN.
    Lorsqu'un espace/tabulation est trouvé, l'état change à chaque passage. Ce n'est manifestement pas ce que tu cherches à faire.

    Allez, un (gros) indice : je viens de donner implicitement la réponse dans ce présent message.
    Plus précisément, dans une structure de code telle que celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if ( ... )
    if ( ... )
    {
    ...
    }
    else
    {
    ...
    }
    Qu'englobe le premier "if" ? Le "if" suivant seulement ou le "if" et "else" suivants ?

    Outre ce problème, je pense qu'il faut légèrement réorganiser ton code. Lorsqu'une série (ou un seul) d'espace/tabulation ne doit provoquer qu'un seul saut de ligne, ton "putchar(c);" va de toute façon créer le boxon car cette instruction est exécutée à chaque tour de boucle. Du coup, s'il y a plusieurs espaces qui se suivent, la fonction affichera à chaque fois quelque chose.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    Je vois, j'ai résolu la première partie de mon pb donc !
    If englobe le if suivant. Ce qui 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    main()
    {
        int state;
        int c;
     
        state = IN;
     
        while ((c = getchar()) != EOF)
        {
     
     
            if (c == ' '|| c == '\t')
            {
                if (state == IN)
                {
                    state = OUT;
                    c = '\n';
                }
            }
            else
            {
                state = IN;
            }
                putchar(c);
        }

    Après pour le pb de putchar(c), je ne vois pas tp cmt faire !!
    Un indice ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    On voit ici que "putchar" est exécuté à chaque tour de boucle. Or, si au moins deux espaces/tabulations se suivent, il faut qu'il ne soit exécuté qu'une seule fois. Du coup, son positionnement actuel ne convient pas. Je ne vois pas d'autre solution que de le supprimer... et d'en mettre ailleurs :

    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
    while ( ... )
    {
       if ( ... )
       {
          if ( ... )
          {
             state = OUT ;
             putchar('\n');
          }
       }
       else
       {
          state = IN ;
          putchar(c);
       }
    }

  5. #5
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    Compris merci =)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2011, 05h34
  2. Réponses: 2
    Dernier message: 26/04/2011, 20h23
  3. [c] Lire un mot choisi par ligne
    Par lutin06 dans le forum C
    Réponses: 2
    Dernier message: 02/03/2007, 14h30
  4. [langage] recuperer le dernier mot dune ligne
    Par kacedda dans le forum Langage
    Réponses: 6
    Dernier message: 29/04/2003, 15h38
  5. [TSynMemo] Positionnement par ligne et colonne
    Par Mercilius dans le forum Composants VCL
    Réponses: 9
    Dernier message: 16/04/2003, 17h22

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