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 :

Utilisation des char[]


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut Utilisation des char[]
    Bonjour,

    j'ai un tableau de char qui a été défini avec une taillemax de n éléments. Les utilisateurs peuvent rentrer une chaine de caractères qui sera stockée dans ce tableau.

    Je ne connais pas la longueur exacte de la chaine entrée par l'utilisateur, mais je dois effectuer un traitement sur le tableau la contenant. Il s'agit de supprimer tous les espaces contenus entre le dernier caractère de la chaine et le '\0'

    Si par exemple dans mon tableau j'ai :

    'e','x','e','m','p','l','e',' ',' ',' ',' ','\0'

    je veux avoir après traitement :
    'e','x','e','m','p','l','e','\0'

    Comment puis-je faire?

    Remarque :
    à priori la chaine est courte.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Salut

    1- J'espère que l'utilisation de char* est une contrainte (sinon std::string)

    2- Fais un parcours à l'envers, et avance en déplaçant (à reculons donc) ton \0 tant que le caractère courant est un espace.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu peux aussi parcourir ton tableau en retenant le dernier caractère non blanc que tu as vu et en affectant un '\0' au caractère suivant quand tu arrives à la fin de la chaîne.

    Quelle que soit la technique que tu utilises, pense à tester le cas où l'utilisateur a entré une chaine vide.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    tu peux faire une boucle jusko caractere nul et ki test chake element du tableau en commencent par le debut et si la valeur est ' ' tu bouge tt les elements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int a[20]{s,f,d, ,g, ,h,f, ,g}
     
    for(int i=0;a[i];i++)
    {
       if(a[i]==' ')
       {
     
               while(a[i])
               {
                   a[i]=a[i+1];
                }
       }
    }

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il ne veut éliminer que les espaces se trouvant à la fin de la chaîne. Parce que tant qu'à faire ce que tu fais, autant utiliser std::remove.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    ok...
    Mais comment je connais la longueur de la chaine avant de faire mon parcourt à l'envers, vu quelle est entrée par l'utilisateur?

    Je pense faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = longueur de ma chaine;
     
    while ( a[i-1] == '  ' && i>0)
    {
      a[i-1] = '\0';
      i--;
    }
    Le tout étant de trouver la "longueur de ma chaine"

    Merci

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    tu fais tout simplement
    int i=0;
    while(a[i++]){}
    i sera la fin de ta chaine

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Utilise strlen. Et à l'occase, les balises CODE également.

  9. #9
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    int L = strlen(MaChaine);
     
    for (int i= L; i>0 /* Evite le cas de la chaine vide*/;i--)
        {
         if (MaChaine[i] != ' ')
             MaCHaine[i] = '\0'; // Disparition des espaces superflus en fin de chaine.
         }

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Caine
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    int L = strlen(MaChaine);
     
    for (int i= L; i>0 /* Evite le cas de la chaine vide*/;i--)
        {
         if (MaChaine[i] != ' ')
             MaCHaine[i] = '\0'; // Disparition des espaces superflus en fin de chaine.
         }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char MaChaine[] = "as-tu essaye avec ceci   ?  ";
    A+

  11. #11
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bien vu,

    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
     
    #include <iostream.h>
    #include <string.h>
     
    int main() {
    char MaChaine[] = "as-tu essaye avec ceci   ?  "; 
     
    size_t L = strlen(MaChaine);
     
    cout << L << endl;
     
    for (int i= L; i>0 /* Evite le cas de la chaine vide*/;i--)
    	{
    	 if (MaChaine[i] != ' ')
    	 MaChaine[i] = '\0'; // Disparition des espaces superflus en fin de chaine.
             break;
    	 }
    cout << endl << MaChaine;
     
    cin.ignore();
    }
    J'avais oublié de casser le boucle

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tant qu'à donner le code...

    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 <cstring>
     
    int main()
    {
        // Chaîne à traiter
        char Chaine[] = " salut  ";
     
        // Pointeur sur la fin de la chaîne à traiter
        char* End = Chaine + std::strlen(Chaine);
     
        // On décrémente le pointeur jusqu'à tomber sur un caractère différent d'un espace, ou sur le début de la chaîne
        while ((End > Chaine) && (*(--End) == ' '))
            ;
     
        // On place la fin de chaîne immédiatement après
        *(End + 1) = '\0';
     
        return 0;
    }

  13. #13
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Oui, je ne voulais attaquer direct avec les pointeurs

    Sinon, dans la même optique:
    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
     
    #include <iostream.h>
    #include <string.h>
     
     
    int main() {
    char MaChaine[] = "as-tu essaye avec ceci   ?  ";
     
    for (char *p = MaChaine + strlen(MaChaine)-1;p >= MaChaine;--p)
    	if ((*p) != ' ') {cout <<"Break";break;}
     
    (*(p+1)) = '\0';
     
    cout << endl << MaChaine;
     
    cin.ignore();
    }

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Caine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <iostream.h>
    #include <string.h>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <iostream>
    #include <cstring>
    Attention aussi à la portée de ton pointeur p, je ne crois pas qu'elle dépasse celle de ta boucle.

  15. #15
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Au boulot j'ai un kjshkqjshdqsk[insulte] de compilateur vieillot.

    Il ne connaît pas d'autres formes d'include, et il ne supporte qu'une partie de la STL.

    Je fais avec donc ou je poste sans tester la solution. Mais aujourd'hui, il vaut mieux que je teste

    Si, (et malheureusement) p n'est pas local à la boucle, du moins avec ce [lskdjlksdjd] de compilateur. Mais pour une fois, ça m'arrange.

  16. #16
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    L'utilisation de vecteurs pourrait faciliter les choses je pense:
    on utiliserai pop pour supprimer les éléments indésirables:
    on utilise strlen ou size pour connaître la longueur de la chaîne, on fais une boucle qui parcourt le tout et qui pop quand le besoin s'en fait sentir

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par reggae
    L'utilisation de vecteurs pourrait faciliter les choses je pense:
    on utiliserai pop pour supprimer les éléments indésirables:
    on utilise strlen ou size pour connaître la longueur de la chaîne, on fais une boucle qui parcourt le tout et qui pop quand le besoin s'en fait sentir
    Dans ce cas autant utiliser std::string, et torcher tout ça en une ligne. Mais cela avait déjà été proposé, et ce n'est apparamment pas le souhait du posteur.

Discussions similaires

  1. De l'utilisation des char const *
    Par Bktero dans le forum C
    Réponses: 7
    Dernier message: 05/01/2012, 00h31
  2. Réponses: 22
    Dernier message: 03/01/2008, 22h42

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