Newsgroup: it.comp.lang.c++
Titolo: gestione stringhe.

Salve.
Ho notato la grande facilita' nella gestione delle stringhe
che permette il c++ rispetto al c.
Non riesco pero' a fare una cosa:
Ho una serie di string:
InsQryBuff;
Anagrafica.Codice ="abc";
Anagrafica.Nome="cde";
ed ho anche un #define Table "tabella".
In c facevo una cosa del genere:
sprintf(InsQryBuf, "insert into %s values(%s, %s)", Table,
Anagrafica.Codice, Anagrafica.Nome);
In c++ si ottiene lo stesso risultato?
Grazie.
-- 
--
Posted from 
crux.tiscalinet.it
 [195.130.224.59]
via Mailgate.ORG Server - 
http://www.mailgate.org

In c++ si ottiene lo stesso risultato?
Per l'esempio che hai riportato è sufficiente usare l'operatore di
concatenazione nel seguente modo:
string InsQryBuff;
Anagrafica.Codice ="abc";
Anagrafica.Nome="cde";
InsQryBuf = (string)"insert into " +  Table + " values(" + Anagrafica.Codice
+ ", " + Anagrafica.Nome + ")";
La conversione a string del primo operando è necessaria perchè altrimente il
compilarore cercherebbe di richiamare l'operatore + per due char*.
Più elegantemente potresti usare gli stream di buffer che ti permettono di
fare tutto quello che era possibile fare con la funzione sprintf
(formattazione inclusa):
#include sstream;
ostringstream InsQryBuf ;
InsQryBuf  << "insert into " << Table << " values (" << Anagrafica.Codice
<< " , "<< Anagrafica.Nome << " )";
...per ottenere il risultato come stringa:
string insert = InsQryBuf.str();
Nota che in uno stream puoi inserire dati di tipo diverso da string (double,
int, char, ecc.) e tutti i tipi di dato non built-in purchè sia definito
l'operatore ostream& operator<< (ostream&, mydatum).
Oreste Notelli

+ ", " + Anagrafica.Nome + ")";
Ma ... che compilatore usi ?
Non mi pare che nella classe string standard sia definito un operatore
di concatenzazione di questo tipo, ma che sia possibile concatenare
solo oggettti std::string e char* : ho controllato sullo Stroustrup 3rd ed.
Inoltre : (string)"insert into " e` un cast alla C, da evitare,
se proprio sarebbe meglio istanziare un oggetto string : 
std::string("insert into ").
-- 
Roberto Gerola
Email: 
robert...@penguinpowered.com
WWW: 
http://www.penguinpowered.com/~The_Cpp_Compass


Non vi č alcuna differenza nel fare una conversione
(string)"insert into" o string("insert into):
sono la stessa conversione anche se usano due sintassi diverse:
la prima č detta "cast syntax", la seconda "function-style syntax".
Il risultato delle due conversioni č identico: entrambe creano un
oggetto di tipo string.
Il vantaggio della sintassi "function-style" č che si possono
creare oggetti che hanno un costruttore che necessita di piů
di un parametro. Esempio: complex(23, 4).
La conversione function-style č inoltre piů elegante, ma in C++
scrivere (string)"insert into" o string("insert into) produce lo stesso
risultato.
Oreste Notelli.







al testo di B.Stroupstrup: li trovi alla sezione "20.3.10 Concatenation".
Grazie, fin li` ci arrivo anch'io.
Ripeto,: avevo frainteso il tipo delle variabili coinvolte
nell'operazione di concatenazione.


Scusate la serie di mail.
Alle volte mi chiedo come mai il Norton Antivirus non riconosca ancora
Microsoft Exchange Server.
Oreste Notelli.

 di concatenzazione di questo tipo,
Confermo che, almeno sul DJGPP, la cosa funziona. Addirittura è
possibile togliere il cast. Ora mi chiedo: è un'estensione del DGJPP
oppure fa parte dello standard. Preciso che ho compilato con -ansi
-pedantic -Wall.
EMG

-pedantic -Wall.
Credo che sia un'estensione del DJGPP, EGCS 1.1.1 vuole
il cast, altrimenti, come facava notare Oreste, cerca
di richiamare un operator + tra due char*, non definito
per la classe std::string AFAIK.


(string)"insert into" o string("insert into):
probabilmente il riferimento era al fatto che la "cast syntax" alla C
benche` possibile in C++ e` (se non erro) deprecata in favore
della sintassi che usa const_cast et similia.
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------------------------

 (string)"insert into" o string("insert into):
Forse l'amico intendeva dire che sarebbe meglio utilizzare i cast del
C++:
static_cast <string> ( "intert into " ) + ...
Comunque il DJGPP non si lamenta neanche se il cast lo tolgo del tutto.
EMG


Ho il sospetto che, nella tua prova, Table non sia qualcosa come
#define Table "tabella", ma un'oggetto di tipo std::string.
In questo caso č, allora, possibile togliere la conversione al primo
operando.
Se cosě non fosse il codice senza conversione non č standard C++.
In C++ si puň ottenere la concatenazione di string literals a compile
time scrivendo stringe adiacenti, non tramite l'operatore +.
Esempio:
scrivendo:
"prima" "seconda" "terza"
il compilatore concantena le tre stringe come se fosse stato scritto:
"primasecondaterza".
Quindi, riesaminando il codice...
InsQryBuf = (string)"insert into " +  Table + " values(" + Anagrafica.Codice
+ ", " + Anagrafica.Nome + ")";
...e deicidessimo di non forzare la conversione del primo operando da
string literal a std::string, si dovrebbe scrivere nel seguente modo:
InsQryBuf = "insert into "   Table  " values(" + Anagrafica.Codice
 + ", " + Anagrafica.Nome + ")";
Oreste Notelli

  + ", " + Anagrafica.Nome + ")";
Ma una cosa del genere sarebbe legale? Quella regola non vale solo tra
literals? Il solito DJGPP non l'accetta.
EMG


Certo! vale solo per gli string literal, e infatti
"inser into ", " values" sono string literal.
Mentre Table è un identificatore definito come
string literal "Tabella" tramite la direttiva
#define del precompilatore.
Il precompilatore sostituisce le occorrenze
dell'identificatore con lo string-token che lo
definisce.
Quindi:
#define Table "Tabella"
InsQryBuf = "insert into "   Table  " values(" + Anagrafica.Codice
+ ", " + Anagrafica.Nome + ")";
dopo la fase di preprocessing, diventa:
InsQryBuf = "insert into "   "Tabella" " values(" + Anagrafica.Codice
+ ", " + Anagrafica.Nome + ")";
... e dopo la fase di concatenazione delle stringhe:
InsQryBuf = "insert into Tabella values(" + Anagrafica.Codice
+ ", " + Anagrafica.Nome + ")";
Oreste Notelli.

 #define del precompilatore.
Oops! Questo mi era sfuggito.
EMG