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 :

remplacer espaceS par espacE


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut remplacer espaceS par espacE
    Bonjours,
    J’ai un programme à faire, dans lequel si je tape plusieurs espaces de suite, ceux-ci doivent être remplacé par un seul espace.
    Comment faire ce bout de programme ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par 8L4CK8ird Voir le message
    J’ai un programme à faire, dans lequel si je tape plusieurs espaces de suite, celles-ci doivent être remplacées par une seule espace.
    Le plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lire un caractère depuis l'entrée standard (fonction getchar)
    si caractère est ' ' et dernier_caractère est ' ' (== ou fonction isspace)
       alors ne rien afficher
    sinon
       afficher le caractère sur la sortie standard (fonction putchar)
    fin si
    stocker caractère dans dernier_caractère

  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 8L4CK8ird Voir le message
    Bonjours,
    J’ai un programme à faire, dans lequel si je tape plusieurs espaces de suite, ceux-ci doivent être remplacé par un seul espace.
    Comment faire ce bout de programme ?
    Il suffit d'écrire le bon code. As-tu au moins réfléchi à un début d'algorithme . Les solutions ne tombent pas du ciel. Il faut réfléchir. Tu ne vas pas nous demander la solution de tous les exercices du K&R...

    Je rappelle que tout programme informatique se résume en gros à un traitement de données selon le schéma bien connu :



    Ici, les entrées, ce sont les caractères lus. Le traitement est le filtre que dois définir et les sorties sont les caractères affichés.

    En gros, on te demande que les caractères de l'entrée soient recopiées en sortie, sauf si il y a plusieurs espaces à la suite, dans ce cas, tu n'en recopie qu'un.

    Comment traduire 'à la suite' en programmation ? Tout simplement en se souvenant du caractère précédent (et oui, si il y a de la mémoire dans les ordinateurs, c'est que parfois il faut 'se souvenir' de certaines choses...).

    En le comparant avec le caractère courant, on devrait pouvoir décider si il faut afficher celui-ci ou non...

    Bref, il faut réfléchir...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Re: j'essay
    Merci, je compte bien sûr réfléchir ! Ce que tu me dis j'y pense mais le problème est que j'ai un manque de vocabulaire et de connaissance. Et donc je n’arrive pas à appliquer ma réflexion sur mon programme n’ayant pas le vocabulaire. Connaitrais-tu une sorte de dictionnaire du langage c qui fasse algorithme au langage c ?

  5. #5
    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 8L4CK8ird Voir le message
    Merci, je compte bien sûr réfléchir ! Ce que tu me dis j'y pense mais le problème est que j'ai un manque de vocabulaire et de connaissance. Et donc je n’arrive pas à appliquer ma réflexion sur mon programme n’ayant pas le vocabulaire. Connaitrais-tu une sorte de dictionnaire du langage c qui fasse algorithme au langage c ?
    Ca n'a aucun sens. Le vocabulaire qu'il faut utiliser les celui de tous les jours. C'est ça l'intérêt de la programmation algorithmique. Et c'est indépendant du langage d'implémentation. Il s'agit d'une phase de réflexion qui a lieu bien en amont du codage.
    http://emmanuel-delahaye.developpez.com/dev_proj.htm

    ensuite, on utilise un langage plus formel (langage algorithmique), mais qui reste indépendant du langage d'implémentation.

    http://emmanuel-delahaye.developpez.com/notes.htm#algo

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut pouquoi cela ne marche pas?
    le programme est censé me remplacer les espaces par un seul espace et j'ai beau tout essayer je n'arrive pas à les remplacer.Juste à les supprimer.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
     
     
    {printf("programme de comptabilisation compte les lignes, espaces et tabulations\npour afficher la comptabilisation faire entre, CRTL+Z puis entre\n");
      int c, nc, es,tab ;
      nc = es = tab = 0;
     while ((c = getchar()) != EOF)
    { putchar(c);
      if (c == ' ')
          printf("\b");
      else (c != ' ')
      c = ((getchar()) + ' ');
     
      if (c == '\n')
         ++nc;
      if (c == ' ')
         ++es;
      if (c == '\t')
         ++tab;
     
    }
    printf("programme de comptabilisation\n nombre de ligne : %d nombre d'espaces : %d nombre de tabulation : %d\n", nc, es, tab);
      system("PAUSE");	
      return 0;
    }

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 398
    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 398
    Points : 23 764
    Points
    23 764
    Par défaut
    Oh ! Misère !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c = getchar()) != EOF)
    Ceci ne marchera pas. Tu ne peux pas mettre le marqueur EOF dans un caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      else (c != ' ') c = ((getchar()) + ' ');
    Ça, je ne vois vraiment pas ce que c'est censé faire !


    Le principe est pourtant simple : si tu veux remplacer tous les espaces par un espace, il te suffit d'afficher le premier et d'ignorer les suivants. Pour ce faire, tu conserves en mémoire la trace du dernier caractère saisi. Si celui que tu es en train de lire est un espace, tu regardes si le précédent l'était aussi. Si c'est le cas, tu ignores ce nouveau caractère, sinon tu l'affiche. Et en bas de ta boucle, tu mets à jour la valeur du caractère « enregistré ».

  8. #8
    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 Obsidian Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c = getchar()) != EOF)
    Ceci ne marchera pas. Tu ne peux pas mettre le marqueur EOF dans un caractère.
    c est de type int. Aucun problème avec ça.

  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 8L4CK8ird Voir le message
    le programme est censé me remplacer les espaces par un seul espace et j'ai beau tout essayer je n'arrive pas à les remplacer.Juste à les supprimer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
         ++nc;
      if (c == ' ')
         ++es;
      if (c == '\t')
         ++tab;
    je ne vois pas ce que viennent faire le compteurs de tabs et de \n dans cette galère... Tu te trompes d'exercices ou tu tu pompes les mauvais corrigés...

    Il faut que tu réfléchisses plus à ce que tu veux faire.

    Déjà, tu peux partir de l'exercice précédent qui faisait la recopie exacte de chaque caractère saisi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int c;
     
    while ((c = getchar()) != EOF)
    {
       putchar(c);
    }
    Maintenant, il faut mettre une condition pour les espaces.

    Déjà, on peut séparer les traitements en 2 :

    espace/non espace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int c;
     
    while ((c = getchar()) != EOF)
    {
       if (c == ' ')
       {
          putchar(c);
       }
       else
       {
          putchar(c);
       }
    }
    Pour le moment, on a strictement rien changé, mais on a préparé le terrain. Je conseille d'aller par étape et de vérifier que le fonctionnement n'est pas dégraté et qu'il tend bien vers le comportement voulu.

    Maintenant, ce qu'on voudrait dans la branche 'espace', c'est ajouter une condition telle que le premier espace rencontré soit affiché, mais pas les suivants si ils sont consécutifs.

    Pour ça, une compteur peut faire l'affaire ou simplement une mémoire du caractère précédant. Si c'est un espace, on affiche pas, sinon, on affiche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (c != cprec)
    {
       putchar(c);
    }
    et il faut penser à enregistrer le caractère à chaque tour :
    On intègre tout ça dans l'algo :
    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
     
    int c;
     
    while ((c = getchar()) != EOF)
    {
       if (c == ' ')
       {
          if (c != cprec)
          {
             putchar(c);
          }   
       }
       else
       {
          putchar(c);
       }
     
       cprec = c;
    }
    on ne plus être très loin de la solution... C'était difficile ?

    A l'arrache :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    hello    world
    hello world
    ^Z
     
    Process returned 0 (0x0)   execution time : 11.332 s
    Press any key to continue.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 398
    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 398
    Points : 23 764
    Points
    23 764
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    c est de type int. Aucun problème avec ça.
    Après vérif' dans la man page, il semblerait en effet que j'aie posté trop vite :

    RETURN VALUE
    fgetc(), getc() and getchar() return the character read as an unsigned char cast to an
    int or EOF on end of file or error.
    Je trouve ça très sale quand même.

  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 : 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 Obsidian Voir le message
    Je trouve ça très sale quand même.
    Je ne vois pas ce que tu veux dire. Il fallait bien une valeur différente d'un caractère pour se différencier (il n'existe pas de 'caractère de fin de fichier'[1]). Je ne comprend pas ce qui te dérange... Tu as une autre solution simple à proposer ?

    ------------------
    [1] sauf cas très particulier des fichiers textes sous DOS (caractère 26 ou ^Z), et encore, j'ai cru comprendre que cette pratique était tombée en désuétude...

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 398
    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 398
    Points : 23 764
    Points
    23 764
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je ne comprend pas ce qui te dérange... Tu as une autre solution simple à proposer ?
    En fait, je m'apercois que je n'ai jamais testé mes fins de fichier ou entrées console de cette façon. Je considérais que getchar() me renvoyait un char et j'utilisais feof(stdin) - sur le descripteur du flux en lecture lui-même, donc - pour voir s'il y avait encore quelque à lire.

    À noter que le Ctrl-D d'Unix n'a pas été choisi au hasard : il balance le code 04, qui correspond à un End Of Transmission dans le code ASCII.

  13. #13
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À noter que le Ctrl-D d'Unix n'a pas été choisi au hasard : il balance le code 04, qui correspond à un End Of Transmission dans le code ASCII.
    Sur ? j'aurai dit -1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    int main(void){
      int c;
      printf("\n")
      for(;;){
        c = getchar();
        printf("%08X\n", c);
        if(EOF == c) {
          break;
        }
      }
      printf("\n");
      return 0;
    }
    cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    a\n
    00000061
    0000000A
    b\n
    00000062
    0000000A
    ^D
    FFFFFFFF

  14. #14
    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 Obsidian Voir le message
    En fait, je m'apercois que je n'ai jamais testé mes fins de fichier ou entrées console de cette façon. Je considérais que getchar() me renvoyait un char et j'utilisais feof(stdin) - sur le descripteur du flux en lecture lui-même, donc - pour voir s'il y avait encore quelque à lire.
    feof() ne fait pas ce que tu crois :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    @mabu: C'est pourtant bien un code ASCII 4 qui est envoyé au système. Il traduit en fin de fichier, c'est tout.

    Sous DOS et Windows, tu envoies un Ctrl-Z à la place (code ASCII 26, 0x14, "SUB"), et le système traduit en fin de fichier également...

Discussions similaires

  1. remplacer les "x" espaces par un seul
    Par Royade dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/03/2013, 10h54
  2. remplacer underscore par espace
    Par fbb53 dans le forum Shell et commandes GNU
    Réponses: 24
    Dernier message: 16/05/2011, 16h32
  3. Remplacement de plusieurs espaces par une seul
    Par Bayard dans le forum Général Python
    Réponses: 2
    Dernier message: 23/11/2008, 18h10
  4. [VBA-E] Remplacer un espace par %20
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/07/2006, 09h05
  5. Comment remplacer un espace par underscore?
    Par Jim_Nastiq dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2006, 16h13

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