Comportement de ostream& operator<<(ostream&, basic_string)

Comportement de ostream& operator<<(ostream&, basic_string) - C++ - Programmation

Marsh Posté le 26-03-2003 à 12:03:55    

Dans mon code (enfin non celui d'un collegue), je concatene un buffer recu d'une connection TCP a une std::string
 

Code :
  1. std::string chaine;
  2. // ...
  3. chaine.append(rcv_buffer, rcv_len);


 
Ce buffer peut contenir un caractere '\0'. Pensez vous que c'est mal de faire un "append" ? Y a-t-il un "contrat" dans le standard C++ qui precise que le parametre "pointe vers un tableau avec des caracteres non nuls" ?
 
Deuxiemement question: si je fais un  
 

Code :
  1. std::cout << chaine;


 
L'implementation differe entre Visual C++ et la libstdc++ (gcc). Le premier fait un
 

Code :
  1. std::cout << chaine.c_str();


 
Le deuxieme fait un

Code :
  1. std::cout.write(chaine.c_str(), chaine.size());


 
Si il y a un caractere nul, ca change tout (enfin si il est valide d'en mettre un). Quel est a votre avis le comportement standard ? Savez vous ou recuperer des infos sur ces points precis du standard ?


Message édité par kenshiro182 le 26-03-2003 à 12:04:42
Reply

Marsh Posté le 26-03-2003 à 12:03:55   

Reply

Marsh Posté le 26-03-2003 à 12:51:45    

essaye write(chaine.data(), chaine.size())
 
la deuxieme methode n'est donc pas bonne parce que strlen(chaine.c_str()) != chaine.size() si comme tu dis il y a des de 0 qui se promène.


Message édité par Taz le 26-03-2003 à 13:22:07
Reply

Marsh Posté le 26-03-2003 à 13:07:59    

++Taz a écrit :

essaye write(chaine.data(), chaine.size())
 
la deuxieme methode n'est donc pas bonne parce que strlen(chaine.c_str()) != chaine.Size() si comme tu dis il y a des de 0 qui se promène


Tout depend si on a le droit de mettre des '\0' dans une std::string. Malheureusement les bouquins sont pas la pour eclaicir sur ces points de detail...

Reply

Marsh Posté le 26-03-2003 à 13:11:39    

kenshiro182 a écrit :


Tout depend si on a le droit de mettre des '\0' dans une std::string. Malheureusement les bouquins sont pas la pour eclaicir sur ces points de detail...


\0 est un caractére comme les autres dans un string.

Reply

Marsh Posté le 26-03-2003 à 13:17:26    

le stroustrup dit clairement qu'une chaine peut contenir un 0. (§20.3.7)
edit: notez bien que l'initialisation à partir de chaine littérale ne permet pas d'insérer des 0. par contre avec string::insert, on peut mettre de 0 partout.


Message édité par Taz le 26-03-2003 à 13:25:03
Reply

Sujets relatifs:

Leave a Replay

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