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 :

Compression d'une chaîne de caractère


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut Compression d'une chaîne de caractère
    Bonjour à tous,
    j'aimerais créer un programme qui compresse une chaîne de caractères (par exemple : "ab cd e" => "abcde" )
    Je ne sais pas si on peut remplacer un espace par "rien du tout". Si oui ce serait bien pratique. Sinon j'ai essayé avec un printf("") seulement si le programme rencontre un espace. De plus, on suppose que l'entrée clavier ne commence pas par un espace (on utilise donc un do-while). Le code clarifiera la situation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int i;
      char sz[ 40];
      gets(sz);
     
      for(i=0;sz[i]!=0;i++)
         while (sz[i]!=' ');
      printf("%s",sz[i]);
     
      printf("");
     
      system("PAUSE");	
      return 0;
    J'entre une chaine mais le programme n'affiche rien de compressé ...
    Merci pour votre aide .

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut
    Premièrement l'usage de gets() est déconseillé. Il vaut mieux utiliser fgets qui est plus sécurisé.

    Ici, c'est plus un problème d'algo
    Moi, je bouclerais sur chaque caractère de chaine_source, je regarderais si c'est un espace(avec isspace() déclaré dans <ctype.h>), si c'en est un je le recopierais dans la chaine de destination, sinon on continue.

    Le problème de ton code, c'est que sz[i] est un char, et non un char*
    Or le code de formattage 's' de printf attendant un char*, donc ça plante.

    (A quoi sert le 'printf("");' ?)

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Voilà comment j'aurais vu la chose:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    #define SIZE_BUF 40
     
     
    int main (void)
    {
       char sz1 [SIZE_BUF] = {0};
       char sz2 [SIZE_BUF] = {0};
     
     
       printf ("Entrez une chaine : ");
     
       /*
        * On recupere la saisie de l'utilisateur.
        *
        * Ici on va preferer utiliser fgets au lieu de gets. gets est une fonction
        * assez dangereuse car elle ne permet de prevenir d'un eventuel debordement
        * de buffer.
        */
       if (fgets (sz1, SIZE_BUF, stdin) != NULL)
       {
          int i = 0;
          int j = 0;
     
     
          if (sz1 [0] != '\n')
          {
             /*
              * On enleve l'eventuel caractere de saut de ligne et on met.
              */
             {
                char * p = strchr (sz1, '\n');
     
                if (p != NULL)
                {
                   *p = 0;
                }
                else
                {
                   int c;
     
                   /* On supprime les caracteres de stdin non lus par fgets. */
                   while ((c = fgetc (stdin)) != '\n' && c != EOF);
                }
             }
     
     
             /*
              * On parcours le buffer sz1 pour enlever les espaces et on stock
              * le resultat dans le tableau sz2.
              */
             for (i = 0; i < strlen (sz1); i++)
             {
                if (sz1 [i] != ' ')
                {
                   sz2 [j] = sz1 [i];
                   j++;
                }
             }
     
     
             /*
              * Affichage de la chaine avant et apres le traitement.
              */
             printf ("sz1 = %s\nsz2 = %s\n", sz1, sz2);
          } 
       }
     
     
       /*
        * getch n'etant pas portable, on peut utiliser getchar.
        */
       printf ("\nPressez une touche pour continuer !\n");
       getchar ();
     
     
       return EXIT_SUCCESS;
    }
    La sortie qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    franhec@franhec-ubuntu:~$ ./test
    Entrez une chaine : une chaine sans espaces entre les mots
    sz1 = une chaine sans espaces entre les mots
    sz2 = unechainesansespacesentrelesmots
     
    Pressez une touche pour continuer !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut
    ok merci a vous
    (A quoi sert le 'printf("");' ?)
    c'était pour justement ne rien afficher à la place de l'espace

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Franck.H
    Voilà comment j'aurais vu la chose:
    Trop compliqué.
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
     
    int main (void)
    {
       char sz1[40] = { 0 };
     
       printf ("Entrez une chaine : ");
       fflush (stdout);
     
       /*
        * On recupere la saisie de l'utilisateur.
        *
        * Ici on va preferer utiliser fgets au lieu de gets. gets est une fonction
        * assez dangereuse car elle ne permet de prevenir d'un eventuel debordement
        * de buffer.
        */
       if (fgets (sz1, sizeof sz1, stdin) != NULL)
       {
          if (sz1[0] != '\n')
          {
             /*
              * On enleve l'eventuel caractere de saut de ligne et on met.
              */
             {
                char *p = strchr (sz1, '\n');
     
                if (p != NULL)
                {
                   *p = 0;
                }
                else
                {
                   int c;
     
                   /* On supprime les caracteres de stdin non lus par fgets. */
                   while ((c = fgetc (stdin)) != '\n' && c != EOF);
                }
             }
     
     
             /*
              * Affichage de la chaine avant le traitement.
              */
             printf ("sz1 = '%s'\n", sz1);
     
             /*
              * On parcours le buffer sz1 pour enlever les espaces et on stock
              * le resultat dans le tableau sz2.
              */
             {
                char *pr = sz1;
                char *pw = pr;
     
                while (*pr != 0)
                {
                   if (!isspace (*pr))
                   {
                      *pw = *pr;
                      pw++;
                   }
                   pr++;
                }
                *pw = 0;
             }
             /*
              * Affichage de la chaine apres le traitement.
              */
             printf ("sz1 = '%s'\n", sz1);
          }
       }
     
       return EXIT_SUCCESS;
    }
    La sortie qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Entrez une chaine : Maitre corbeau sur un arbre perche
    sz1 = 'Maitre corbeau sur un arbre perche'
    sz1 = 'Maitrecorbeausurunarbreperche'
     
    Press ENTER to continue.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par olivier1209
    ok merci a vous


    c'était pour justement ne rien afficher à la place de l'espace
    Hé bin c'est rien en fait, c'est une chaîne vide c'est tout.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Trop compliqué.
    Oui en effet, je n'avais pas pensé tout de suite à l'astuce des pointeurs
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Franck.H
    Oui en effet, je n'avais pas pensé tout de suite à l'astuce des pointeurs
    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
     
             {
                char *pr = sz1;
                char *pw = pr;
     
                while (*pr != 0)
                {
                   if (!isspace (*pr))
                   {
                      *pw = *pr;
                      pw++;
                   }
                   pr++;
                }
                *pw = 0;
             }
    C'est une oeuvre d'art... Ca ferait un beau T-shirt, non ?

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    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
     
             {
                char *pr = sz1;
                char *pw = pr;
     
                while (*pr != 0)
                {
                   if (!isspace (*pr))
                   {
                      *pw = *pr;
                      pw++;
                   }
                   pr++;
                }
                *pw = 0;
             }
    C'est une oeuvre d'art... Ca ferait un beau T-shirt, non ?
    Vais me faire presser un T-Shirt avec ca dessus ... Et pourquoi pas l'imprimer et l'encadrer ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut
    je trouve ça aussi très beau mais tu pourrais ajouter quelques commentaires STP

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par olivier1209
    je trouve ça aussi très beau mais tu pourrais ajouter quelques commentaires STP
    WTF ? C'est du code auto-commenté !
    • p = pointer
    • r = read
    • w = write

    Il faut en dire plus ? Qu'est-ce que tu ne comprends pas ? Savoir lire du code simple fait aussi partie de ce métier...

  12. #12
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    WTF ? C'est du code auto-commenté !
    • p = pointer
    • r = read
    • w = write

    Il faut en dire plus ? Qu'est-ce que tu ne comprends pas ? Savoir lire du code simple fait aussi partie de ce métier...

    Peut-être que olivier1209 débute dans le métier et n'est pas familier de toutes ces subtilités :p

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01
  3. [Debutant(e)] Analyse d'une chaîne de caractères
    Par maire106 dans le forum Langage
    Réponses: 6
    Dernier message: 22/03/2004, 15h04
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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