Newsgroup: it.comp.lang.c++
Titolo: stringhe in C++

salve, avrei bisogno di qualche idea per fare questo programmino.
Ho una stringa di caratteri alfanumerici,per essere più precisi ci
sono numeri (anche reali) e spazi, di cui a me interessa memorizzare i
numeri per poi allocarli in una matrice.Faccio un esempio per chiarire
meglio.
stringa N1 = " -9,3    4  7    "
stringa N2 = "-13,2  12  7,2 "
matrice[0][0]=-9,3
matrice [0][1]= 4
.
.
.
matrice[1][2]= 7,2
le stringhe hanno tutte le stesse dimensioni (24 caratteri) ma gli
spazi biachi variano in base se il numero è a 1 cifra ,2 se è negativo
ho se ha numeri dopo la virgola.
Vi ringrazio

 stringa N2 = "-13,2  12  7,2 "
1. Salti gli spazi bianchi  (isspace)
2. Memorizzi un puntatore al primo carattere non spazio
3. Cerchi il successivo spazio o fine stringa
4. Converti in float il numero tra i due puntatori
5. Goto 1.
E.

atz...@gmail.com
 ha scritto:

usi una libreria come qt:
QString str;
QStringList list;
str = " -9,3    4  7    ";
list = str.split(QRegExp("\\s+"));
foreach (QString str, list)
{
....
matrice[x][y] = str.toDouble();
....
}

michelangelo giacomelli ha scritto:

facciamo un esempio anche con le wxwidgets sennò poi mi dicono che
faccio pubblicità gratuita alle qt.
#include <wx/string.h>
#include <wx/tokenzr.h>
int main(int argc, char **argv)
{
  wxStringTokenizer tkz(wxT(" -9,3    4  7    "), wxT(" "));
	while ( tkz.HasMoreTokens() )
	{
		wxString token = tkz.GetNextToken();
		wxPuts(token);
	}
}
sia le qt che le wxwidgets sono sotto licenza libera quindi perché non
usare librerie precotte?

 usare librerie precotte?
Perche' non e' questione di licenza. Tirare in ballo un toolkit grafico
per manipolare delle stringhe e' sparare alle zanzare con un cannone.
Si, poi Qt ha anche un sacco di roba non grafica. Ma di fatto stl +
boost fanno uguale. Stando solo su stl magari uno impara qualcosa pure.
-- 
-riko

atz...@gmail.com
 ha scritto:

Non vorrei sembrare troppo all'antica ma in questo caso strtod sembra 
proprio fatta apposta...

Enrico Franchi ha scritto:

Ok chiedo scusa sono abituato a pensare a prodotti completi che
utilizzano anche le gui per cui qt o wxw sono d'obbligo, il fatto è che
questi framework hanno pure un set di classi per stringhe, thread,
network, opengl, stampa etc... e dopo un pò di utilizzo si tende ad
tirarle in ballo per qualsiasi cosa.

 tirarle in ballo per qualsiasi cosa.
Ed e' una cosa che io critico quando non meditata. In generale legarti
anche negli strati bassi a un toolkit potrebbe non essere la migliore
delle idee, specie tenendo conto che ci son fior di librerie che offrono
tutto questo con ottime implementazioni.
-- 
-riko

On 24 Mar, 15:19, 
r...@despammed.com
 (Enrico Franchi) wrote:

Qt non è un semplice toolikt, è un framework. Inoltre, QtCore e
QtNetwork (per citare due fra i moduli più usati) sono del tutto
indipendenti da QtGui.
In questo modo Qt è ottimo anche per gestire processi di rete che
hanno bisogno di un elevato rendimento prestazionale, non tenendo
conto poi che una soluzione basata Qt (che ricordo ora essere LGPL) è
decisamente più portabile su piattaforme di diverso tipo.
Certo, se poi lo scopo è realizzare un "programmino", allora vanno
bene tutte le soluzioni :-)

 tutto questo con ottime implementazioni.
considera comunque che sia qt che wxwidgets sono framework modulari
quindi puoi tranquillamente utilizzare solo il nucleo piů ad esempio le
funzioni per stringhe o i tokenizer e basta.
dopotutto suggerisci di utilizzare boost quindi ti appoggi comunque ad
una libreria esterna (e per altro non hai nemmeno fatto un esempio
rispetto al suggerimento chiesto) io ne ho fatti due con due librerie
omnicomprensive di cui si puň utilizzare solo le parti necessarie e per
inciso sia le qtstring che wxstring come dici te offrono ottime
implementazioni (copy on write, allocamento sullo stack, etc)

 Vi ringrazio
Dato che sei in C++, io consiglierei gli stringstream. Una volta creato 
lo stream dalla tua stringa, estrai i numeri come dallo standard input. E 
gli spazi te li toglie automaticamente.
Vedi: 
http://www.cplusplus.com/reference/iostream/stringstream/
Saluti

 gli spazi te li toglie automaticamente.
Non ho capito, intendi qualcosa come:
#include <iostream>
#include <sstream>
std::stringstream s = "2   3   5"; // Che non compila
???
E poi estrarre come?
Ciao 

Facendo un po' di prove ho scritto questo codice che credo sia quello che tu 
intendessi:
#include <iostream>
#include <sstream>
#include <string>
std::stringstream s ("2.3    4    5.8 ");
int main() {
    std::string str;
    while (s >> str)
          std::cout << str << std::endl;
   return 0;
}
Giusto?
Per convertire da string a double, potrei usare strtod, ma il secondo 
parametro a cosa serve?
Il primo è un const char* quindi gli passo str.c_str(), ma il secondo è un 
char**, a che serve? 

 }
// E.

> }
Ah si può direzionare il flusso anche verso double quindi 

Noixe ha scritto:

Chiamerei l'operazione s>>x "estrarre un x da s" non "ridirezionare".
E.

 Ah si può direzionare il flusso anche verso double quindi
E' quello che intendevo dire con "estrai i numeri come dallo standard 
input".