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 :

Pointeur sur une string


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Pointeur sur une string
    Bonjour,

    Je cherche sans trouver de réponse comment avoir un pointeur sur un objet string.
    Le but est d'utiliser les pointeurs (qui sont rapide) pour éditer une string.
    Le code ci-joint ne fonctionne pas car s->c_str() retourne un const char * et non un char *.
    Savez-vous comment je dois procéder*?

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    using namespace std;
     
    void decalage_1(char *s)
    {
    	char *ptr;
     
    	ptr = s;
    	while (*ptr)
    	{
    		*ptr = *ptr + 1;
    		ptr++;
    	}
    }
     
    void decalage_2(string *s)
    {
    	char *ptr;
     
    	ptr = s->c_str(); // error: invalid conversion from ‘const char*’ to ‘char*’
    	while (*ptr)
    	{
    		*ptr = *ptr + 1;
    		ptr++;
    	}
    }
     
    int main(void)
    {
    	char *s1 = (char *)malloc(sizeof(char) * 255);
    	strcpy(s1, "foo");
    	decalage_1(s1);
    	printf("%s\n", s1); // gpp
    	free(s1);
     
    	// ------
     
    	string *s2;
    	s2 = new string("bar");
    	decalage_2(s2);
    	printf("%s\n", s2->c_str());
    	delete s2;
     
    	return 0;
    }
    Merci beaucoup de vos réponses.

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    si vous voulez modifier une string alors utilisez les opérations définies sur string, dans votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void decalage_2(string *s)
    {
    	s->erase(0, 1);
    }
    remarque complémentaire : string est faite pour être utilisée directement, pas via un pointeur, et si voulez qu'elle soit modifiée utilisez plutôt une référence, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void decalage_2(string &s)
    {
    	s.erase(0, 1);
    }
     
    int main(void)
    {
    	...
    	string s2("bar");
     
    	decalage_2(s2);
    	...
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Ca ne sert à rien ce que tu veux faire. Un pointeur n'est pas rapide.

    Ton code a le défaut de débutant:

    - des pointeurs partout
    - un mélange de C et de C++

    Un code C++ ça ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
        std::string s("bar");
     
        s.erase( 0, 1 );
    }
    En C++ tu ne passes pas ta vie à convertir d'un std::string à un char*.. On utilise directement les opérations de strings.

    Pour les pointeurs, on en utilise le moins possible. Comme tu peux le voir sur le code d'exemple, il n'y a pas de new ni de delete à gérer, et tout marche.

  4. #4
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 394
    Points : 591
    Points
    591
    Par défaut
    bonjour,

    Jette un coup d'oeil là dessus.

    on y lit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    The returned C-style string should not be modified, as this could invalidate the pointer to the string, 
    or deleted, as the string has a limited lifetime and is owned by the class string.
    Si tu veux vraiment accéder aux caractères de ta chaine par des pointeurs, utilise plutôt les std::string::iterator, mais ça m'étonnerait que tu fasse plus rapide que les méthodes des la classe string.

    jm

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::string s("bar");
     
    s.erase( 0, 1 );
    ne va pas avoir l'effet escompté, son but est d'incrémenter la valeur de chaque caractères. (foo -> gpp)

    Tu peux faire
    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 f(char& c){
        c++;
    }
     
    int main(void)
    {
     
    	string s("bar");
     
    	for_each(s.begin(),s.end(),f);
     
    	cout << s << endl;//affiche "cbs"
     
    	return 0;//
    }

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Citation Envoyé par atttchoum Voir le message
    son but est d'incrémenter la valeur de chaque caractères. (foo -> gpp)
    effectivement, j'avais mal lu son code, je pensais qu'il faisait un décalage pour retirer le 1er caractère, au temps pour moi
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

Discussions similaires

  1. pointeur sur une string ?
    Par awalter1 dans le forum Général Python
    Réponses: 8
    Dernier message: 01/03/2011, 13h52
  2. Pointeur sur une chaine de caractère string
    Par Lucier dans le forum C#
    Réponses: 9
    Dernier message: 17/03/2010, 15h22
  3. Réponses: 14
    Dernier message: 14/03/2005, 10h16
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 21h26
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 15h17

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