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

  1. #1
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    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
    Points : 9 818
    Points
    9 818
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    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 régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    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
    Points : 9 818
    Points
    9 818
    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 régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    Si tu veux simplifier, tu peux même enlever les { } pour le for et le if

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par millie
    Si tu veux simplifier, tu peux même enlever les { } pour le for et le if
    Argh! Et rendre le code illisible?

  9. #9
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    Sur cet exemple, il ne risque pas de devenir illisible.

  10. #10
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    -edit-
    non rien ça ne correspond pas a la question, en plus le probléme est resolut !

    le bouton resolu bordel !

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void trim(char * pszChamps)
    {
    char* ptr=NULL;
    if(ptr=strstr(pszChamps," ")){
             *ptr='\0';
             }
    }
    Pour éviter de faire une boucle "for".

  12. #12
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    T'as essayé avec char * szChamps et pas char szChamps[] ?
    Nomalement c'est pareil.

  13. #13
    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 : 44
    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
    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

  14. #14
    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 : 44
    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
    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

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    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.

  16. #16
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    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

  17. #17
    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 : 44
    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
    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

  18. #18
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Ok donc ça nous 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    /****************************************************
    * 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 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);
    }
    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...
    Yup, ça me paraît bien blindé.



    Bahan

  19. #19
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Je me permets de remonter ce sujet, car j'ai réfléchi à une variante de cette fonction qui permettrait d'enlever les blancs avant, pendant et apres :

    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 szChampsIn[], char szChampsOut[])
    {
        int i=0;
        int j=0;
     
        for(;i<strlen(szChampsIn);i++)
        {
            if(szChampsIn[i] != ' ')
            {
                szChampsOut[j] = szChampsIn[i];
                j++;
            }
        }
     
        printf("Et le resultat est : [%s]\n", szChamps);
    }
    Bon, le souci est que je n'ai pas encore réussi à mettre en option le fait que l'on veuille supprimer les blancs à l'avant, à l'arrière ou dans la chaîne. Peut-être qu'en mettant des booléens en paramètres...?

    Hum, oui, car le problème de ma fonction actuelle est qu'elle supprime tous les blancs...

    Ouaip, faut que j'améliore ça, ce n'est pas encore au point

    Bahan

  20. #20
    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 : 44
    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
    C'est un problème algorithmique pas vraiment du C. Le plus simple est de définir 3 autres fonctions qui font la suppression pre, au milieu, et post...

    Jc

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

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

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