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 :

Probleme de blanc dans une chaine


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut Probleme de blanc dans une chaine
    Bonjour à toutes et à tous.

    Dans le code que j'utilise actuellement, à un instant donné, j'ai une variable ayant comme valeur un certain nombre de caractères alphanumériques puis quelques caractères blancs.

    J'aurais aimé savoir comment je pouvais me débarasser de ces derniers.

    Pour l'instant, j'ai tenté la chose suivante :

    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
    void trim(char szChamps[])
    {
    	int i=0;
    	int iBoucle = 0;
     
    	for(i=0; iBoucle = 0 && i<strlen(szChamps);i++)
    	{
    		if(szChamps[i] == ' ')
    		{
    			szChamps[i] = '\0';
    			iBoucle = 1;
    		}
    	}
     
    	printf("Et le resultat est : [%s]\n", szChamps);
    }
    Ainsi, je place le caractère de fin de chaine dès que je trouve un blanc et je sors de ma boucle puis de ma fonction. Cependant, j'ai toujours les blancs à la fin de ma chaîne ^_^.

    Peut-être devrais-je passer par la création d'une nouvelle variable ?

    Merci d'avance, si vous avez des suggestions/conseils ?

    Bahan

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    T'as essayé avec char * szChamps et pas char szChamps[] ?

    Puis le: i<strlen(szChamps) n'est pas forcement bon, il va recalculer à chaque fois la longueur, ce qui fait que quand tu as remplacé par \0, en théorie, il va s'arrêter tout de suite (donc pas besoin de ton booléen).

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    un code qui doit ce trouver sur le forum :
    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
    83
    84
    85
    86
    87
    88
    89
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
     
    char* supprime(const char *src)
    {
    	char *dest = NULL,*res;
    	int n = strlen(src);
    	int i, dansunmot, j=0;
     
    	dest = malloc(n+1);
    	if(dest == NULL)
    		 {
    		 return NULL;
    		 }
     
    	 //Cherche le premier non espace
    	 i = 0;
    	 while((i<n) && (src[i]==' '))
    		 i++;
     
    	 //On est dans un mot
    	 dansunmot = 1;
     
    	 //Jusqu'a la fin de la chaine
    	 while(i<n)
    	  {
    	    //Si c'est un espace, on fait remarquer qu'on n'est plus dans un mot
    	    if(src[i]==' ')
    	      {
     	      dansunmot = 0;
    	      }
    	    else 
    	      {
    	      //Si on n'est pas dans un mot, on met un espace
    	      if(dansunmot==0)
    	        {
    		dest[j]=' ';
    		j++;
    	        }
    	      //On est dans un mot
    	      dansunmot = 1;
    	      //On copie la lettre
    	      dest[j] = src[i];
    	      //On incremente l'indice de destination
    	      j++;
    	      }
    	    //On incremente l'indice de la source
    	    i++;
    	  }
     
    	//Mettre le '\0' a la fin
    	dest[j] = '\0';
    	j++;
     
    	//On realloue pour avoir la bonne taille
    	res = realloc(dest,j);
    	if(res)
    		return res;
    	else
    		return dest;
    }
     
     
    int main()
    {
    	int i;
    	char *res;
    	const char s[9][50] = { 
    		"bonjour comment ca va",
    		"est-ce que  ca  va  vraiment  ?",
    		"  devant y a rien",
    		"  serieux   que     dalle",
    		"derriere non plus  ",
    		"  vraiment, je te jure    ",
    		"   et  bien   sur  le   test  final   ",
    		"      ",
    		""
    	};
     
    	for(i=0; i<9; i++)
    	{
    		res = supprime(s[i]);
    		if(res)
    			printf("Avant : -%s-\nApres : -%s-\n",s[i],res);
    		free(res);
    	}
    	return 0;
    }

  4. #4
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Merci pour tes conseils Millie.
    Ils se sont avérés justes.

    Cependant, j'aimerais bien comprendre pourquoi quand je place une chaîne de caractère en argument, cela ne fonctionne pas, tandis que quand je place un pointeur de chaine de caractere, ça passe ? je pensais qu'une chaine de caractère fonctionnait de manière similaire à un pointeur...

    Merci Gege pour le code.

    Bahan

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je ne sais pas exactement pourquoi, mais j'ai toujours utilisé un * et pas un [].

    Pourtant, le code suivant donne les bons résultats :

    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
    #include<stdio.h>
    #include<stdlib.h>
     
    void tt(int t[])
    {
     fprintf(stderr, "%d = %d\n", (int) t, t[0]);    
     
    }
     
    int main(int argc, char *argv[])
    {
      int i = 3;
      fprintf(stderr, "%d = %d\n", (int) &i, i);
      tt(&i);
     
      system("PAUSE");	
      return 0;
    }

  6. #6
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Je redonne la fonction que j'ai obtenu :

    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
    /****************************************************
    * Fonction : trim
    *
    * Description : 
    * enleve les caracteres blancs au bout d'une chaine
    *
    * Syntaxe : 
    * int trim(char * pszChamps)
    *
    * Arguments :
    *   char * pszChamps	: chaine de caractere avec "blancs" a la fin
    *
    * Val. Retour : -
    *						
    **********************************************************
    void trim(char * pszChamps)
    {
    	int i=0;
     
    	for(; i<strlen(pszChamps); i++)
    	{
    		if(*(pszChamps+i) == ' ')
    		{
    			*(pszChamps+i) = '\0';
    		}
    	}
    }
    Merci à vous.

    Bahan

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Si tu veux simplifier, tu peux même enlever les { } pour le for et le if

  8. #8
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Bahan
    Pour l'instant, j'ai tenté la chose suivante :

    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
    void trim(char szChamps[])
    {
    	int i=0;
    	int iBoucle = 0;
     
    	for(i=0; iBoucle = 0 && i<strlen(szChamps);i++)
    	{
    		if(szChamps[i] == ' ')
    		{
    			szChamps[i] = '\0';
    			iBoucle = 1;
    		}
    	}
     
    	printf("Et le resultat est : [%s]\n", szChamps);
    }
    Le problème de ce code par rapport aux autres solutions est dans la condition d'arrêt du for :
    C'est un test que tu voulais donc :

    Citation Envoyé par millie
    Si tu veux simplifier, tu peux même enlever les { } pour le for et le if
    Mauvaise pratique...

    Jc

  9. #9
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Dépendant du nombre de chiffre par rapport au nombre d'espace tu pourrais aussi faire (pas testé par contre):

    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
    void trim(char szChamps[])
    {
    	int i=0;
    	int iBoucle = 0;
     
            i=strlen(szChamps)-1;
     
            if(i>=0)
       	{
    	if(szChamps[i]==' ')
    		{
    		for(; (iBoucle == 0) && (i>=0);i--)
    			{
    			if(szChamps[i] != ' ')
    				{
    				szChamps[i+1] = '\0';
    				iBoucle = 1;
    				}
    			}
    		}
    	}
    	printf("Et le resultat est : [%s]\n", szChamps);
    }
    [EDIT]Oubli du +1[/EDIT]
    Jc

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour moi, le code de fearyourself (que je n'ai pas testé non plus) semble avoir le mérite de pouvoir être utilisé pour d'autres chaînes, puisqu'il retire les espaces à partir de la fin: Une chaîne contenant un espace au milieu ne devrait pas être tronquée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    non rien ça ne correspond pas a la question, en plus le probléme est resolut !

    le bouton resolu bordel !
    Oups, pardon pour l'oubli .

    Pour ton code, Feary :

    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
    void trim(char szChamps[])
    {
    	int i=0;
    	int iBoucle = 0;
    	
            i=strlen(szChamps)-1;
    
            if(i>=0)
       	{
    	if(szChamps[i]==' ')
    		{
    		for(; (iBoucle == 0) && (i>=0);i--)
    			{
    			if(szChamps[i] != ' ')
    				{
    				szChamps[i] = '\0';
    				iBoucle = 1;
    				}			}
    		}
    	}
    	printf("Et le resultat est : [%s]\n", szChamps);
    }
    Au niveau de la boucle if, je ne comprends pas trop. Si le caractère est différent de blanc alors on va mettre ce caractère à '\0' ? Mais dans ce cas, ne risque-t-on pas de tronquer la chaine szChamps de son dernier caractère ?

    En tous les cas, merci à tous pour vos réponses diverses et variées.

    Bahan

  12. #12
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Bahan
    Oups, pardon pour l'oubli .

    Pour ton code, Feary :

    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
    void trim(char szChamps[])
    {
    	int i=0;
    	int iBoucle = 0;
    	
            i=strlen(szChamps)-1;
    
            if(i>=0)
       	{
    	if(szChamps[i]==' ')
    		{
    		for(; (iBoucle == 0) && (i>=0);i--)
    			{
    			if(szChamps[i] != ' ')
    				{
    				szChamps[i] = '\0';
    				iBoucle = 1;
    				}			}
    		}
    	}
    	printf("Et le resultat est : [%s]\n", szChamps);
    }
    Au niveau de la boucle if, je ne comprends pas trop. Si le caractère est différent de blanc alors on va mettre ce caractère à '\0' ? Mais dans ce cas, ne risque-t-on pas de tronquer la chaine szChamps de son dernier caractère ?

    En tous les cas, merci à tous pour vos réponses diverses et variées.

    Bahan
    Code corrigé... J'ai oublié le +1 dans l'affectation... Il faut lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    szChamps[i+1] = '\0';
    On sait qu'on ne déborde pas à cause du premier test sur i et après avec le premier test sur szChamps[i]==' ' donc il y a au moins un espace...

    Jc

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/12/2009, 21h30
  2. Réponses: 8
    Dernier message: 05/08/2006, 13h30
  3. Probleme de coupe dans une chaine
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2005, 23h39
  4. Réponses: 3
    Dernier message: 31/01/2005, 23h18
  5. [LG]Retirer les blancs dans une chaine
    Par Andy_24DB dans le forum Langage
    Réponses: 16
    Dernier message: 25/02/2004, 16h30

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