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

Télécharger C Discussion :

Eliminer les espaces superflus [Sources]


Sujet :

Télécharger C

  1. #1
    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 Eliminer les espaces superflus
    Bonjour, Je vous propose un nouvel élément à utiliser : Eliminer les espaces superflus



    Cette fonction supprime les espaces superflus dans une chaîne de caractères.



    Qu'en pensez-vous ?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je la trouve bien mais peut etre un peu longue ??
    Pourquoi pas :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char    *epur(char *str)
    {
      char  *res = NULL;
      int   i;
      int   y;
     
      y = 0;
      res = malloc((strlen(str) + 1) * sizeof(char));
      /* malloc de la taille initiale + 1 pour le '\0' */
      if (res == NULL)
        return (NULL);
      for (i = 0; str[i] == ' ' && str[i]; i++);
      /* saut des espaces au debut */
      for (; str[i]; i++)
        {
       /* Si c'est un mot on l'ajoute dans notre nouvelle chaine */
          if (str[i] != ' ')
            {
              res[y] = str[i];
              y++;
            }
          else if (str[i] == ' ' && str[i + 1] != ' ' && str[i])
          /* Sinon, si c'est un espace et que le prochain caractere n'est pas un espace (donc un mot) on ajoute un espace pour separer les mots (verification si on est pas en fin de chaine avec str[i]) */
            {
              res[y] = ' ';
              y++;
            }
        }
      res[y] = 0; /* Ajout du '\0' de fin de chaine */
      res = realloc(res, y); /* realloc de la taille reelle */
      return (res);
    }
    Qu'en pensez vous ?

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Quelques commentaires :
    -1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (i = 0; str[i] == ' ' && str[i]; i++);
    le second test est inutile : si str[i] == ' ' alors str[i] != 0

    -2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for (; str[i]; i++)
      {
          if (str[i] != ' ')
          ....
          else if (str[i] == ' ' && str[i + 1] != ' ' && str[i])
    str[i] est toujours dans le else égal à ' ' (et donc aussi != 0 ce qui de plus était déjà testé dans le for englobant)

    -3 Erreur dans le realloc() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     res = realloc(res, y+1);
    Le realloc doit aussi être fait par la procédure utilisée par fearyourself

    -4 Ne traite pas correctement les blancs en queue de chaine (en laisse un)

    -----------------------------------
    Une version qui fait la chose sur place en modifiant la chaine d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void epur(char* chaine)
    {
      int blanc  = 1;
      char* lire = chaine;
      char* ecrire = chaine;
      while(*lire != '\0')
      {
        if(*lire != ' ' || !blanc)*ecrire++ = *lire;
        blanc = *lire ==' ';
        lire++;
      }
      if(blanc && ecrire != chaine) ecrire--;
      *ecrire = '\0';
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Merci pour tes remarques :

    1- Oui c'est vrai, faute d'inatention voila ce que c'est de coder trop vite sans tout verifier =)

    2- comment ca "str[i] est toujours dans le else égal à ' '" si str[i] est une lettre il rentre dans le premier if ?? (et pour les str[i] != 0 je voulai ecrire str[i + 1], ce qui nous enleve le probleme 4)

    3- au temps pour moi j'ai pas l'habitude des realloc =)

    4- Probleme reglee au 2-

    Et merci pour les commentaires.
    Sinon je viens de tester mon code marche donc bien avec le str[i + 1] et en corigeant le realloc.

    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
    char    *epur(char *str)
    {
      char  *res;
      int   i;
      int   y;
     
      y = 0;
      res = malloc((strlen(str) + 1) * sizeof(char));
      if (res == NULL)
        return (NULL);
      for (i = 0; str[i] == ' ' && str[i]; i++);
      for (; str[i]; i++)
        {
          if (str[i] != ' ')
            {
              res[y] = str[i];
              y++;
            }
          else if (str[i] == ' ' && str[i + 1] != ' ' && str[i + 1])
            {
              res[y] = ' ';
              y++;
            }
        }
      res[y] = 0;
      return (res);
    }

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Mes 2 centimes:
    - diogene, je ne comprends pas ton || &&, il manque peut-être des parenthèses (et même, le != ' ' && == ' ' s'annule non ?)
    - cyberboss le else du str[i] != ' ' implique forcément que str[i] == ' '

    Allez, à moi, à moi:
    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
    #include <string.h>
    #include <stdlib.h>
     
    char *epur(const char *s)
    {
    	char *new, *p;
    	if (!s || !(new = p = strdup(s)))
    		return NULL;
    	for (; *s; ++s) {
    		/* on a un caractère non-blanc, ou alors le prochain l'est (et on n'est pas au debut) */
    		if (*s != ' ' || (*(s+1) && *(s+1) != ' ' && p != new))
    			*(p++) = *s;
    	}
    	*p = '\0';
    	/* on pourrait très bien ici faire `return new;` */
    	if ((p = realloc(new, p+1-new)))
    		new = p;
    	return new;
    }
    PS: c'est néanmoins marrant de voir les différents styles ;D

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par D[r]eadLock Voir le message
    Mes 2 centimes:
    - diogene, je ne comprends pas ton || &&, il manque peut-être des parenthèses (et même, le != ' ' && == ' ' s'annule non ?)
    Non, dans l'exemple de diogene, les deux tests ne s'annulent pas. && est prioritaire sur || ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*lire != ' ' || !blanc && *lire == ' ')
    est équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*lire != ' ' || (!blanc && *lire == ' '))
    Personnellement, même si ça reste simple à lire dans un tel cas, j'aurais plutôt tendance à mettre les parenthèses.

  7. #7
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par gl Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*lire != ' ' || (!blanc && *lire == ' '))
    Du coup ça revient à (et ce que j'entendais par s'annulent, et j'avoue que "simplifient" aurait été plus approprié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (*lire != ' ' || !lblanc)

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par D[r]eadLock Voir le message
    Du coup ça revient à (et ce que j'entendais par s'annulent, et j'avoue que "simplifient" aurait été plus approprié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (*lire != ' ' || !lblanc)
    Au temps pour moi, je n'avais pas compris le "s'annulent" dans ce sens là.

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Vous avez raison
    Je modifie mon post en conséquence.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. [DOM] XML Supprimer les espaces superflus
    Par NizarK dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 29/04/2012, 07h22
  2. Eliminer les espaces entre deux blocks
    Par zinabd dans le forum Designer
    Réponses: 3
    Dernier message: 23/10/2008, 17h43
  3. Eliminer les espaces dans une chaine de caractere
    Par sialafrere dans le forum WinDev
    Réponses: 2
    Dernier message: 02/05/2008, 21h42
  4. eliminer les espaces d'une chaine de caractères
    Par wassim_kh dans le forum Langage
    Réponses: 1
    Dernier message: 14/07/2006, 11h20
  5. Réponses: 1
    Dernier message: 18/05/2006, 09h11

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