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 :

String


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [Résolu] String
    Salut toutt le monde.

    Bon, je debute sous c++, et jessay d'adapter un prog c en c++. Et j'ai trouvé la class string, qui me simplifirait peut etre la vie, si je comprenais comment elle fonctionne.
    J'ai donc deux questions:
    Ou puis-je trouver une descpription des methodes de cette classe?
    J'ai fait une boucle sur la taille d'un string et j'ai l'impression qu'un caractère occupe 2 caractère (comme de l'unicode) (si str est un string contenant "salut" str.size()=10). Est-ce pareil partout?

    Voila voila
    Merci a+

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette superbe reponse.
    Néanmoins javais deja regardé cette faq.

    Il ya marqué:
    size renvoie le nombre de caractères contenus dans la chaîne (par exemple 4 pour "abcd")

    Or chez moi ce n'est pas 4 qui est renvoyé mais 8.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Soit tu n'utilise pas la classe string de la std, soit il y a une "erreur" dans ton code (qu'il faudrait nous montrer ...), soit il y a un drole de problème...

    std::string utilisant des char, à moins de ne pas initialiser la chaine correctement, je trouve aussi ça anormal.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Ok, c'est pas bete de mettre mon code.
    Je precise que mon os est freebsd, si jamais ca change quelque chose
    En gros si je fais
    sock.sockRead(10);
    Il me renvoie un string de 5 caractère

    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
     
     
    string Socket::sockRead(int maxLength)
    {
      string buffer;
      char tmpReponse;
      int i=0;
      while(read(sockDesc,&tmpReponse,1)){
        if(tmpReponse=='\r' || buffer.size()>=(maxLength-1)){
          buffer.append("\0");
          break;
        }
        cout << tmpReponse << endl;
        buffer.append(&tmpReponse);
      }
      return(buffer);
    }
    Voila,voila
    Merci et désolé de galérer comme ca

  6. #6
    kg
    kg est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Peut etre que tu devrais essayer
    buffer.append(1,tmpReponse);
    à la place de
    buffer.append(&tmpReponse);

    Mais je suis sur de rien.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer.append(&tmpReponse);
    En effet cette ligne est dangereuse...
    Tu ne sais pas ce qu'il y a après ton carctère dans la mémoire. Tu lui donne l'adresse d'un caractère, alors qu'il attend l'adresse d'une chaine de caractère (terminée par '\0').

    Voici plusieurs solutions (dont cele donnée ci dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    buffer.append(1, tmpReponse);
    // ou
    buffer += tmpReponse;
    // ou
    buffer.push_back(tmpReponse);
     
     
    // Si tu veux utiliser tmpReponse comme une chaine de caractères :
    char tmpReponse[2] = "";
    while(read(sockDesc,tmpReponse,1)) { /*...*/}
    buffer.append(tmpReponse);
    // ou
    buffer += tmpReponse;

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut Re: String
    Citation Envoyé par OjY|lo
    caractère occupe 2 caractère (comme de l'unicode) (si str est un string contenant "salut" str.size()=10). Est-ce pareil partout?
    dans ton cas c'est parce qu'elle contient "salut\0\0\0\0\0". strlen te renverrait 5, mais la classe string c++ permet de contenir des caractères nuls.
    ce code ne fait rien, car append attend un char* terminé par nul, donc "", "\0" ou "\0\0\0" pour lui c'est pareil : c'est une chaine vide. Donc il append() rien du tout.
    append( '\0' ) en revanche ajoute bien le car '\0'.

    Vu ton besoin, tu devrais peut être plutôt utiliser vector<char>, qui à mon avis prête moins à confusion.

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut Re: String
    Citation Envoyé par Aurelien.Regat-Barrel
    append( '\0' ) en revanche ajoute bien le car '\0'.
    string & string::append(char c); n'existe pas.
    Dans append('\0'), '\0' est probablement considéré comme un entier et converti en pointeur (const char *), causant -au moins chez moi- une erreur système.

    Pour ajouter un caractère, quelqu'il soit, à la fin de la chaine, il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void string::push_back(char c);
    D'un autre coté, je ne vois pas l'intérêt d'ajouter un caractère '\0' à la fin. std::string gère tout seul la longueur de la chaine, son stockage et autres choses du genre. On peut convertir std::string en une chaine de caractère terminée par '\0' avec la fonction c_str().

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Ok
    En gros c'est deja étonnant que ca me renvoie quelque chose.

    Donc pas besoin de \0 a la fin des string.
    Je regarde tout ca.

    Merci

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bon bah, j'ai utilisé un char*, puis recopié celui-ci, à la fin de la lecture, dans un string.

    Est-ce que la class string fait une réalocation à chaque fois qu'on modifie un élément comme en java?

    Merci encore a tous

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Non pas forcément. Cela dépend de l'heuristique d'agrandissement du buffer interne alloué.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  2. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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