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 :

PB très simple. Plusieurs espace blanc en un seul


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 PB très simple. Plusieurs espace blanc en un seul
    Bonjour tout le monde,

    Je suis toute nouvelle ici, et pareil pour le langage C, je débute.
    Je suis en train d'étudier le langage C sur le livre 'le langage C' de Kernighan et Ritchie.
    Je suis très embêtée car je ne comprends pas un de leur exercice où j'ai trouvé la solution. Et ça me torture !!!!!!! Bref cet exo consiste à remplacer plusieurs espace par un seul dans une chaine de caractère.

    Bon donc je sais que ça peut paraitre vraiment bête mais moi, je ne connais que le Python donc je pense que ça doit bcp m'influencez dans mon incompréhension ^^
    le code de l'exo 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
    26
    #include <stdio.h>
     
    main()
    {
      int c;
      int b;
     
     
      b = 0;
      while((c = getchar()) != EOF)
      {
        if(c == ' ') //Si dans le texte entre il y a un espace
        {
          if(b == 0)
          {
            b = 1;
            putchar(c);
          }
        }
        if(c != ' ')
        {
          b = 0;
          putchar(c);
        }
      }
    }
    J'aimerais savoir, comment arrive t'on a remplacer plusieurs espaces en un seul via dans une chaine de caractère via ce code...

  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
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(c == ' ') //Si dans le texte entre il y a un espace
    {
    if(b == 0)
    {
    b = 1;
    putchar(c);
    }
    }
    La variable "b" vaut 0 au début.
    Dès qu'un espace est trouvé, on entre dans les deux "if", ce qui met "b" à 1. Du coup, si un second (ou troisième, etc) espace suit, comme "b" vaut 1, on n'entre plus à l'intérieur du second "if" et cet/ces espace(s) n'est (ne sont) donc pas affiché(s).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(c != ' ')
    {
    b = 0;
    putchar(c);
    }
    Dès qu'un caractère autre qu'un espace est trouvé, "b" est remis à 0.

    En fait, "b" sert simplement à se "souvenir" si un espace vient d'être rencontré et cela permet donc de n'afficher qu'un seul espace consécutif. Il ne s'agit pas de "remplacer" plusieurs espaces par un seul mais seulement de n'en afficher qu'un seul au maximum au cas où plusieurs se suivent.

    Par contre, leur exemple aurait été un peu plus "sympa" s'il affichait une chaîne de caractères, en ignorant les espaces successifs. Là, dans ce code, c'est caractère par caractères, avec saisie sur clavier.
    Mais bon, ce qui compte ici, c'est de comprendre l'algorithme.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut =)
    Non en faite, j'ai pas tout compris...

    Je comprends pourquoi on rentre dans le premier if : c == ' '
    puis dns le second if, b == 0
    mais je ne comprends pas pourquoi :
    b = 1;//Des que le premier espace est rencontre, b devient 1
    putchar(c);

    permet de ne renvoyer qu'un espace. Parce que putchar(c) ça devrait renvoyé la valeur entière de c, nan ? à partir du moment ou b devient 1, la deuxième instruction (putchar(c)) est qd même exécuter non ?
    Parce que si par exemple je mets : "coucou bonjour"
    (3 espaces entre les deux mots)
    Je rentre dans la première boucle, puis dans la 2éme, mon b devient 1 dès le premier espace rencontré, et donc après je rentre dans la deuxième instruction tout de suite, c'est ça ? alors comment on peut afficher à l'écran ce qu'il suit, c'est à dire 'bonjour'. Il faudrait que je comprenne ce qu'il se passe exactement, caractère par caractère.
    Merci de m'aider en tout cas !

  4. #4
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    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 c;
      int b;
     
     
      b = 0;
      while((c = getchar()) != EOF)
      {
        if(c == ' ')(1)
        {
          if(b == 0)
          {
            b = 1;
            putchar(c);
          }
        }
    
        if(c != ' ') (2)
        {
          b = 0;
          putchar(c);
        }
      }
    }
    En fait, quand on commence à saisir des caractères, b=0.
    b agit comme un verrou.


    Quand tu saisis tes caractères tu as deux possibilités :
    • le caractère saisi est un espace
    • le caractère saisi n'est pas un espace

    Si ton caractère est un espace (le premier d'une série), on l'affiche, mais on bloque l'affichage des espaces suivant (en mettant b à 1).
    Quand, un 'non espace' arrive, on debloque le verrou pour permettre l'affichage d'un nouvel espace.

    Un exemple court : "affichons qu'un espace".

    Donc, tant que tu saisies "affichons", tu passes par la boucle (2).
    Tu arrives à un espace. Il passe la boucle (1). A ce moment tu mets à 1 la variable B.
    Quand tu saisies le deuxième espace, tu repasses à la boucle (1), mais vu que tu as b == 1 de vrai, tu ne peux pas l'afficher.
    Quand tu resaisies un caractère non espace, tu passes à la boucle (2) et tu remets la variable b à 0, ce qui permettera d'afficher un espace quand il se presentera.

  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 !
    OUIIIII
    Cette fois-ci j'ai VRAIMENT COMPRIS =)
    Merfci bcp, en fait je ne m'étais pas rendu compte que chaque caractère de la variable c était traité un à un...
    Merci bcp =)

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

Discussions similaires

  1. [RegEx] Remplacer une suite d'espace blanc par un seul
    Par Sayrus dans le forum Langage
    Réponses: 2
    Dernier message: 27/06/2008, 11h31
  2. [RegEx] Remplacer plusieurs espaces succesifs par un seul
    Par Marcus15 dans le forum Langage
    Réponses: 8
    Dernier message: 22/03/2007, 11h48
  3. [nouveau] saisir plusieurs espace de suite ou tabuler
    Par siuol dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 28/02/2005, 12h32
  4. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44
  5. Réponses: 4
    Dernier message: 04/03/2003, 01h05

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