Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1170 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Comportement des string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comportement des string

n°1585529
nathan_g
Posté le 12-07-2007 à 09:04:59  profilanswer
 

Bonjour,
 
Je souhaiterais utiliser des string dans un programme c++ mais je rencontre un comportement étrange.
Quand je tape :
 

Code :
  1. string comment0;
  2. comment0.reserve(20);
  3. comment0[0] = '1';
  4. comment0[1] = '2';
  5. comment0[2] = '3';
  6. comment0[3] = '4';
  7. comment0[4] = '\0';
  8. cout << comment0.length() << " " << comment0.size() << " " << comment0.capacity() << endl;


Le résultat est 0 0 20, comme si la defintion du string comment0 valeur par valeur n'était pas prise en considération, malgré la présence d'un '\0' en bout de chaine.
 
Par contre le code suivant :
 

Code :
  1. string comment0;
  2. comment0.reserve(20);
  3. comment0= "1234";
  4. cout << comment0.length() << " " << comment0.size() << " " << comment0.capacity() << endl;


renvoie bien 4 4 20, comme atttendu.
 
Quelqu'un pourrait-il m'indiquer pourquoi n'est-il pas possible de définir une variable de type string élément par élement mais seulement d'un coup ?
J'ai vérifié la correspondance des valeurs entre elles (en demandant le renvoi de la valeur du booléen comment0[i] == 'i' pour 0<=i < 5 et les valeurs sont bien indentique ?
 
D'ou provient la différence selon-vous ?
 
Merci d'avance de votre aide.
 

mood
Publicité
Posté le 12-07-2007 à 09:04:59  profilanswer
 

n°1585531
Un Program​meur
Posté le 12-07-2007 à 09:07:47  profilanswer
 

reserve() permet de changer la taille de la chaine sans reallocation, mais ne change pas la taille effective.  Pour ca, il faut utiliser resize().

n°1585534
nathan_g
Posté le 12-07-2007 à 09:11:01  profilanswer
 

Bonjour,
 
Je ne comprends pas précisément la différence entre "taille de la chaine" et "taille effective". Dans ce dernier cas, est-ce qu'il s'agit du nombre de caractères, avant de rencontrer '\0' ?
Est-ce que c'est cette différence de comportement qui explique la différence des renvoies de valeurs entre les deux codes ?

n°1585557
Un Program​meur
Posté le 12-07-2007 à 09:41:43  profilanswer
 

nathan_g a écrit :

Je ne comprends pas


 
Les std::string permettent de stocker des sequences de caracteres (et '\0' n'est pas traite specialement par les std::string).
Le nombre de caractere stocke a un moment donne est donne par string::size() (ou par string::length() qui renvoie toujours la meme chose).
Le nombre maximum de caracteres qui peuvent etre stocke sans reallocation est donne par string::capacity().
string::resize() permet de changer la taille, soit en supprimant des caracteres a la fin, soit en ajoutant des caracteres (donne par le second argument qui vaut '\0' par defaut).
string::reserver() permet de changer le nombre maximum de caracteres qui peuvent etre stocke sans reallocation.
Le probleme des reallocations, c'est que ca invalide les iterateurs et que ca entraine une copie de ce qui est deja dans la chaine.
 

n°1585669
Taz
bisounours-codeur
Posté le 12-07-2007 à 11:43:23  profilanswer
 

nathan_g a écrit :

Bonjour,
 
Je ne comprends pas précisément la différence entre "taille de la chaine" et "taille effective". Dans ce dernier cas, est-ce qu'il s'agit du nombre de caractères, avant de rencontrer '\0' ?
Est-ce que c'est cette différence de comportement qui explique la différence des renvoies de valeurs entre les deux codes ?


reserve c'est juste de l'abstraction qui fuit. oublie cette fonction membre et y a plus de problemes

n°1585739
nathan_g
Posté le 12-07-2007 à 13:18:54  profilanswer
 

Rebonjour,
 
Merci de ces nouvelles précisions, mais pourquoi les lignes de codes suivantes :
 

Code :
  1. comment0 = "1234";
  2. comment0[4] = '5';
  3. comment0[5] = '6';
  4. cout << comment0.size() << endl;


me renvoient une valeur de 4 ?
 
Je m'attendais à une valeur de 6, étant donné que 6 éléments sont, au final, stockés dans le string comment0 !
 
Cordialement

n°1585783
Un Program​meur
Posté le 12-07-2007 à 14:21:41  profilanswer
 

nathan_g a écrit :

Je m'attendais à une valeur de 6, étant donné que 6 éléments sont, au final, stockés dans le string comment0 !


 
Il ne faut pas utiliser des indices plus grand ou egal a size().  Pour ajouter en fin de chaine, tu as string::push_back(), string::append() et string::operator+=().

n°1585974
nathan_g
Posté le 12-07-2007 à 20:07:31  profilanswer
 

Merci de ces précisions !
 
Effectivement, mon écriture était incorrecte pour la gestion des string.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Comportement des string

 

Sujets relatifs
Bon tutorial sur la gestion de string en c/c++[résolu] transformer string en array (maladie ?)
Afficher des String aléatoirement dans une case RectangleEdition d'offset pour string table
[C] fonction pour remplacer du texte dans une stringVB2005 : Conversion d'une valeur string en valeur numérique
[BATCH] Supprimer les " d'un string [résolu]Chiffrer un String avec RSA
Comportement bizarre sous IE7 => bug?Comportement de ostream& operator<<(ostream&, basic_string)
Plus de sujets relatifs à : Comportement des string


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR