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 :

problème avec le type string


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 94
    Points : 74
    Points
    74
    Par défaut problème avec le type string
    Voilà mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsigned short *value;
    string str=""
     
    value = (unsigned short *) &str[0];
    *value = 2007;
    value = (unsigned short *) &str[2];
    *value = 08;
    value = (unsigned short *) &str[4];
    *value = 24;
     
    cout<<str;
    Mon problème est le suivant :
    je dispose d'une string vide que je souhaite remplir. Pour cela j'utilise un pointeur qui va se déplacer le long de ma string.
    Enfin je souhaite afficher la string entière sauf qu'en fait rien ne s'affiche.

    Est-ce que vous auriez une idée qui pourrait m'aider à résoudre mon problème.

    Merci par avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <iostream>
    #include <sstream>
     
    using namespace std;
     
    int main()
    {
        stringstream sstr;
        sstr << "2007" << "08" << "24";
        cout << sstr.str();
     
        return 0;
    }
    Perso j'envoi tous dans sstr et je recupere une string avec la methode str().
    Y a peu-etre plus simple...

  3. #3
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Ce n'est pas comme cela qu'on modifie un string!
    Qu'y aura-t-il d'après toi aux positions 1 et 3? De plus, tu ne peux pas accéder pas au caractères 0, 2 et 4 si ton string est vide.
    Utilises plutôt assign(), append() pour lui donner du contenu, et at() ou [] pour y accéder.

    Tu ne peux pas modifier comme ça un caractère. Pour ce faire, soit tu passes par un iterator, at() ou [], et tu modifies ton caractère. En aucun cas par un pointeur (tu ne sais pas comment le container est géré). De plus, str[x] ne te renvoie pas une adresse, mais un string::reference, ce qui n'est pas du tout la même chose.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 94
    Points : 74
    Points
    74
    Par défaut
    Pourtant si j'affiche par exemple str[0]
    j'ai bien la valeur 2007 qui s'affiche.

    EDIT : je l'ai pas précisé mais j'utilise le type string de la librairie ptypes

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Je ne sais pas exactement ce que tu cherches à faire, je vois que tu utilises string d'un côté (chaîne de caractère) et que de l'autre tu utilises des entiers.

    En tout cas, ça, ça marche, même si je ne sais pas si ça répond à ta quesion :

    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
     
    #include <iostream>
    #include <string>
     
    int main()
    {
        std::string str;
        str += "2007";
        str += "/";
        str += "08";
        str += "/";
        str += "24";
        // Ou plus simplement : str = "2007/08/24";
     
        std::cout << str.c_str() << std::endl; // Si on inclut pas <string>
        std::str << str << std::endl; // Si on inclut <string>
     
        system("pause");
        return 0;
    }
    Attention à quelque chose comme str += 12, genré essayer de rentrer un nombre dans une chaîne, car il va essayer d'interpréter ce nombre comme la valeur d'un caractère, avec des résultats assez ératiques ; si tu veux prendre un entier et l'ajouter comme chaîne à une string, passe par la procédure itoa() (en C).

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    nul besoin de chercher midi à 14h: en c++, pour convertir quelque chose en string on utilise les stringstream, comme l'a montré fafacpp.

    Cela dit, je viens de jeter un coup d'oeil à la doc de ptypes (intéressant, je ne connaissais pas), et la classe string fourni les fonctionalités dont tu as besoin: http://www.melikyan.com/ptypes/doc/s...onversion.html

    Par exemple:
    string itostring(<ordinal> value);

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 94
    Points : 74
    Points
    74
    Par défaut
    Ce que je comprend pas c'est que case par case (str[0], str[2]) cela affiche ce que je veux. Maus quand j'affiche la string entière (str), j'ai rien.

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Ce n'est peut-être pas ça, mais au cas où:
    si tu fais juste:
    il y a de grands risques pour que rien ne s'affiche effectivement. Il faut faire un flush (forcer la sortie du buffer de l'objet cout dans la console). Et on fait ça, généralement, avec un endl (endl a un double effet: retour à la ligne + flush):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << str << std::endl;
    hope it helps.

  9. #9
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Il y a certainement un conflit entre le std::string de la STL et le string de ptypes au moment du passage à std::cout.
    Comment std::cout peut-il accepter en entrée un string de ptypes à la compilation sans passer par un cast?

    Personnellement j'évite de mixer les librairies à moins de ne pas avoir le choix et de maitriser les différents liens entre elles.

    Essaye éventuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << (char*)str;

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par remooz Voir le message
    Voilà mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsigned short *value;
    string str=""
     
    value = (unsigned short *) &str[0];
    *value = 2007;
    value = (unsigned short *) &str[2];
    *value = 08;
    value = (unsigned short *) &str[4];
    *value = 24;
     
    cout<<str;
    Ton code invoque des comportements non définis.
    1) Il n'est pas autorisé de lire un caractère à un index d'une chaîne supérieur à sa taille (tout indice tout toujours être strictement à inférieur à la taille de la chaîne)
    Une bonne implémentation de la bibliothèque standard devrait te cracher à la gueule en mode debug.
    2) Caster un T1* en un T2* a un résultat non spécifié, et est non défini quand l'objet pointé par T1* n'existe pas et/ou quand la mémoire pointé ne satisfait pas les pré-requis d'alignement et de taille de T2.

    Ensuite, il est clair que même si ça marchait, ça ne ferait pas du tout ce que tu crois que ça fait.
    Le short 2007 (octets 0xd7 0x07 en little-endian), ce n'est pas la même chose que la chaîne "2007" (octets 0x32 0x30 0x30 0x37 0x00).

Discussions similaires

  1. Problème avec le type BLOB dans oracle
    Par pguedia dans le forum Oracle
    Réponses: 1
    Dernier message: 10/11/2005, 18h33
  2. problème avec le type timestamp
    Par aline dans le forum Oracle
    Réponses: 6
    Dernier message: 21/02/2005, 11h05
  3. probléme avec une date/string dans un CommandText
    Par critok dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/02/2005, 16h30
  4. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 18h06
  5. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 19h48

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