Newsgroup: it.comp.lang.c++
Titolo: Problema con classe std::string

]

         s[1]='\0';
std::string non ha bisogno dello 0 alla fine.
	Mauro


comunque non capisco a cosa serva tutto questo codice:
potresti scrivere qualcosa del genere
 string S="A";
 string s;
 s=tolower(S[0]);


std::string non ha bisogno dello 0 alla fine.
Grazie (anche per il resto), lo so, ma in altre parti del programma
dovevo usare s.data() come una stringa "c" classica.


potresti scrivere qualcosa del genere
A nulla, era solo un "estratto" da altro codice, serviva per provare
il comportamento di string accedendovi come un array. 


 dovevo usare s.data() come una stringa "c" classica.
std::string ha il metodo
  const char * c_str() const;
che restituisce una stringa C-style (con 0 finale).
	Mauro

che restituisce una stringa C-style (con 0 finale).
Non l'avevo mai visto... restituisce lo stesso buffer od una copia?


 Non l'avevo mai visto... restituisce lo stesso buffer od una copia?
Una copia non modificabile.  Guarda anche i metodi data(), che
restituisce un array di char non terminato; e copy(), che e' simile
alla procedura str[n]cpy di <cstring>.
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

  s.push_back( tolower(S[0]) );
L'ho notato adesso. Usavo una versione non recentissima delle STL
(quelle fornite con il gcc ver 2.8.1 e con il VC++ 5.0) ed il
push_back() con string manca. Con l'ultima versione di STLport (la
3.12) e' presente, riesco a compilare con il gcc ma non con il VC,
nonostante lo riconosca. Il problema e' banale: troppi #ifdef etc
annidati (il compilatore ha un limite interno di 32); ma non riesco ad
aggirarlo... Ho provato allora a scaricare l'ultima versione di SGI
STL (la 3.2), ma e' stata un fallimento completo (innumerevoli errori
con VC++). Visto che la STL fornita con il VC++ 5.0 e' decisamente
vecchia ed incompleta, qualcuno sa dirmi se esiste un port abbastanza
recente usabile o come ha aggirato i problemi presenti con le
distribuzioni che ho nominato?


 distribuzioni che ho nominato?
gcc e' fermo alla 2.8.1; non vi saranno altre versioni.  il suo
successore e' egcs, la versione attuale la 1.1.2, e' ottimo ed ha
tutto quello che ti serve (sia gcc che g++).  
ftp.sunet.se
, directory
/pub/gnu/egcs/releases/egcs-1.1.2 .


 Non l'avevo mai visto... restituisce lo stesso buffer od una copia?
Penso che dipenda dall'implementazione e che nella maggior parte
dei casi restituisca lo stesso buffer (dopo aver aggiunto lo 0).
Comunque il buffer e' di proprieta' di std::string: non va modificato
(e' un const char *) o deallocato, e non e' piu' valido dopo una modifica
alla stringa.
Lo scopo principale di c_str e' quello di permettere di passare
stringhe a funzioni che chiedono char *:
  void pippo( const char * );
  std::string s;
  ...
  pippo( s.c_str() );
Per ottenere una copia utilizzabile senza restrizioni c'e' il metodo
  size_type copy( char * buf, size_type length, size_type start = 0 ) const
che copia length caratteri a partire da start dalla stringa al buffer.
Esempio:
  std::string s;
  char * buf = new char [s.length()+1];
  s.copy( buf, string::npos );
  buf[s.length()] = 0;
In questo modo si ottiene una copia indipendente.
	Mauro



/pub/gnu/egcs/releases/egcs-1.1.2 .
Gia' installato e lo sto "esplorando", grazie, ma per ora ho dei
progetti iniziati con il gcc e quasi conclusi e non so se vale la pena
di cambiare... anche perche' usando STLPort va tutto bene
Piuttosto non c'e' nessuno che riesce a compilare una versione recente
e completa delle STL con il Visual C?  
