Comportement des string

Comportement des string - C++ - Programmation

Marsh Posté le 12-07-2007 à 09:04:59    

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.
 

Reply

Marsh Posté le 12-07-2007 à 09:04:59   

Reply

Marsh Posté le 12-07-2007 à 09:07:47    

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

Reply

Marsh Posté le 12-07-2007 à 09:11:01    

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 ?

Reply

Marsh Posté le 12-07-2007 à 09:41:43    

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.
 

Reply

Marsh Posté le 12-07-2007 à 11:43:23    

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

Reply

Marsh Posté le 12-07-2007 à 13:18:54    

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

Reply

Marsh Posté le 12-07-2007 à 14:21:41    

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+=().

Reply

Marsh Posté le 12-07-2007 à 20:07:31    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed