Newsgroup: it.comp.lang.c++
Titolo: StringTokenizer in cpp





Ciao 


e scusate per la domanda magari 
idiota...


 


Sono un programmatore java ma a differenza di molti 
ho dovuto scrivere una applicazione in c++ con Borland c++ builder 5 
professional...


 


Purtroppo data la mia piccola conoscenza del c++ 
non so se esiste una funzione StringTokenizer del Java in c++..


 


Faccio un esempio per chi non conoscesse 
Java.


 


Esempio...


 


AnsiString 
pippo="Mario;Giovanni,Toni";


 


 


Io dovrei mettere in tre stringhe i singoli 
valori


 


 


AnsiString string1="Mario";


AnsiString string2="Giovanni";




AnsiString string3="Toni";


 


 


Come posso ottenere questo ? in c++


Grazie 


 




Forse la mia soluzione non e` la piu` efficiente, comunque dovrebbe
funzionare. Eccoti un programmino di esempio:
#include <iostream>
#include <list>
#include <string>
using namespace std;
list<string> tokenize(const string& s, const string& delim)
{
  list<string> slist;
  int j=0;
  for(int i=0;i<s.length();++i)
    {
      if(delim.find(s[i])!=string::npos)
      {
	if(i!=j) slist.push_back(s.substr(j,i-j));
	j=i+1;
      } 
    }
  if(j<s.length())
    slist.push_back(s.substr(j));
  return slist;
}
int main()
{
  list<string> tokens;
  tokens=tokenize("Mario;Giovanni,Toni Aldo",";, ");
  copy(tokens.begin(),tokens.end(),ostream_iterator<string>(cout,"\n");
}
L'output e`:
Mario
Giovanni
Toni
Aldo
Spero di esserti stato utile.
Ciao,
Alberto Griggio


in C c'e' la funzione strtok, dovrebbe essere utilizzabile anche in C++,
ma opera sulle stringhe come array di caratteri terminate in '\0', non
con la classe 'string' del C++.
Secondo me perņ la puoi utilizzare benissimo lo stesso (la classe string
si converte in ountatore a carattere con il metodo char *
string::c_str()).
Spero di essere stato utile.
Salutoni
Un Rak Vagans

 con la classe 'string' del C++.
Sai per caso se č standard? Grazie

string::c_str()).
ad essere pignoli il metodo è
cont char* string::c_str()
quindi stai attento che non puoi modificarlo direttamente.
--
Antonio Cuni, 18 anni, studente
Brainbench Certification: 
Master C++: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688

Sai per caso se è standard? Grazie
si, la funzione strtok è standard, ma non ne ho sentito parlare un
gran bene: cmq stai attento che se usi i thread potrebbe incasinarti
il tutto.
Anto






Grazie mi funziona a meraviglia.......


 


OOOOOOO COME SONO FELICE???????


 


 


GRAZIE A TUTTI....


BY DEVIS



 il tutto.
Potresti essere più preciso? Io l'ho usato in una applicazione multi-thread,
e sembra funzionare benissimo. Grazie ancora, ciao

e sembra funzionare benissimo. Grazie ancora, ciao
strtok e' una di quelle funzioni che sarebbe meglio non ci fossero del
tutto. I problemi che ha sono:
 - Modifica la stringa in cui deve effettuare la ricerca
   Questo e' un problema filosofico... se sto cercando quali sono
   le parole che compongono una linea e' assurdo che per farlo io
   sia obbligato a distruggere la linea stessa. Dal punto di vista
   pratico ad esempio non e' possibile chiamare strtok cercando di
   spezzare un literal...
      void myfun(char *p); /* usa strtok */
      ...
      myfun("Hello, world.\n"); /* whooops! vietato! */
   questo richiede di farsi una copia ad uso locale per il solo
   scopo di fare una scansione. Molto discutibile.
 - Si perde l'informazione di quale sia il separatore che ha
   terminato il token
 - Memorizza lo stato in una variabile locale impedendo il
   nesting di scansioni
   strtok memorizza un puntatore alla "stringa corrente" in una
   sua variabile locale e utilizza questo puntatore per la
   scansione dei token successivi. Ad esempio questo codice e'
   molto rischioso...
      char *p=strtok(my_string,my_separators);
      while(p)
      {
        elabora_token(p);
        p=strtok(NULL,my_separators);
      }
   il problema e' che se elabora_token o qualunque delle
   funzione chiamate da elabora token chiama strtok viene
   modificata la "stringa corrente" e al ritorno dalla
   chiamata ci si trova con le carte in tavola cambiate.
   Non esiste fra l'altro nessun modo di "salvare" lo stato
   di strtok e di ripristinarlo; questo implica che fra le
   specifiche di documentazione della funzione e' necessario
   indicare che viene usato strtok e che di conseguenza il
   chi usera' la mia funzione non puo' usare strtok.
 - In alcune implementazioni addirittura strtok non e'
   multithread safe e la variabile interna in cui viene
   memorizzato lo stato della scansione e' condivisa fra i
   vari thread (con risultati disastrosi facilmente
   immaginabili se diversi thread - anche completamente non
   correlati - usano la funzione).
   Altre implementazioni per lo meno hanno risolto questo
   problema e i dati interni sono memorizzati per-thread.
Il problema principale che ha strtok e' secondo me che e'
una funzione di libreria: per ottenere le sue funzionalita'
bastano poche righe di codice ma nessuno vorrebbe scrivere
una cosa cosi' brutta... per qualche strano motivo pero' se
queste brutture sono nella libreria standard allora e' come
se scomparissero.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

    multithread safe
Aggiungerei che non permette di ottenere "null tokens": niente (o solo
whitespace) tra due separatori.  Per tutti questi motivi, ce ne sono
in giro parecchi di sostituti di strtok...
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

    problema e i dati interni sono memorizzati per-thread.
Orca, grazie dell'informazione, ciao

 e scusate per la domanda magari idiota...
Dovresti evitare di scrivere il HTML.
Comunque ecco una semplice soluzione (non il massimo
dell'efficienza...).
Le stringstream sono trattate in qualsiasi(?) testo decente di C++.
#include <sstream>
int main()
{
   std::string pippo = "Mario;Giovanni;Toni";
   std::istringstream in(pippo);
   std::string string1, string2, string3;
   std::getline(in, string1, ';');
   std::getline(in, string2, ';');
   std::getline(in, string3, ';');
   // ...
}
Saluti   Manlio Perillo