|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Estrarre token da una stringa in c++
Salve a tutti, sto scrivendo un programma in C++, con visual studio2005 e devo estrarre i token da una stringa.
Ho provato ad utilizzare strtok ma il compilatore mi dice che è deprecato, quale classe o funzione posso utilizzare in alternativa? Grazie, ciao ciao. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Forse ti dice che la funzione è obsoleta (poveracci....
Codice:
String *testo = "questa è una:semplice.prova";
Char delimitatori[] = s= {' ', ':', ';'};
String *tokens[] = 0;
int i = 5;
tokens = testo->Split(delimitatori, i);
1) Puoi specificare una serie di delimitatori dei tuoi tokens, invece che uno solo (se ne vuoi uno solo, puoi tranquilamente togliere la variabile "delimitatori" nel mio codice, e passare il carattere di delimitazione direttamente nel metodo Split, in questo modo: Codice:
// Il delimitatore è un carattere : (due punti)
tokens = testo->Split(':', i);
Il risultato è fornito in un array di stringhe (nel caso prendi più token in un colpo) oppure in una semplice stringa (in posizione tokens[0] nel mio codice). Puoi come al solito usare un Iterator per muoverti all'interno della stringa di partenza, per vedere subito se ci sono altri tokens disponibili (tipo StringTokenizer::hasMoreTokens() di Java). Comunque ti consiglio di NON usare il parametro i, quindi fare: Codice:
tokens = testo->Split(delimitatori); EDIT: dimenticavo... Il codice scritto è C++ managed (ovvero sia gestito dal framework .NET) quindi nel caso usi una bella #using <mscorlib.dll> all'inizio del tuo programma. Ovviament poi il tuo programma si appoggerà al framework .NET... Non so se non ti conviene usare la classica strtok
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 11-10-2006 alle 10:12. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Nell'altro post ho parlato di iteratori: per capire meglio la cosa posto un esempio completo:
Codice:
#using <mscorlib.dll>
using namespace System;
using namespace System::Collections;
int main()
{
String* testo = S"questa è una:semplice.prova";
Char delimitatori[] = {' ', ':', ';'};
String* tokens[] = words->Split(delimitatori);
// Ora posso muovermi all'interno dell'array di stringhe creato con la split.
IEnumerator* token = tokens->GetEnumerator();
while (token->MoveNext()) {
String* s = __try_cast<String*>(token->Current);
if (!s->Trim()->Equals(S""))
Console::WriteLine(s); // Scrivo a console il token.
}
}
Però se vuoi usare (o stai usando) il C plain, usa tranquillamente la strtok, se compili con il compilatore C++ .NET quel qarning te lo tira fuori comunque... Ignoralo, o sopprimi dalle opzioni di progetto quel tipo di avvertimento, o fai usare a Visual Studio il compilatore C
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 11-10-2006 alle 10:13. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
L'ho giá scritto in questo post: http://www.hwupgrade.it/forum/showpo...41&postcount=9 dal man di strtok: Codice:
BUGS Never use these functions. If you do, note that: These functions modify their first argument. These functions cannot be used on constant strings. The identity of the delimiting character is lost. The strtok () function uses a static buffer while parsing, so it's not thread safe. Use strtok_r ()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Solo ora mi sono accorto che il thread parlava esplicitamente di C++ Comunque c'è sempre strtok_r, oppure se vuole rimanere in C può usare la strchr(). Ma se usa C++ plain una bella getline() della classe string può fare al caso suo EDIT: In verità, neanche io ho mai usato la strtok
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
anche se sto in C++ con tutte le sue funzioncine, api, vespe e minchiatine varie, devo usare la strchr
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fammi un esempio di stringa...
|
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Dec 2005
Città: Provincia di Vicenza
Messaggi: 174
|
Quote:
il "Deprecated" e` solamente un warning di compilazione, e non un errore, quindi se la compilazione non va a buon fine e` per qualche altro motivo. Puoi comunque disabilitare tale warning mettendo nei "Prepocessor definitions" del progetto la define "_CRT_SECURE_NO_DEPRECATE". ciaoooo |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ci sono mille altri modi per recuperare quelle stringhe con il C++, ma devo sapere come è fatta la stringa da cui devi recuperare i campi...
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Usando la funzione split (using tutto quello che è necessario e che mi avete detto) mi viene dato questo errore:
managed targeted code requires a '/clr' option A quanto ho capito dovrei modificare le opzioni del progetto, ma dato che quelle non vorrei toccarle (visto che deve passare ad un altro poi) mi sono convinto ad utilizzare lo stesso strtok. Ora una curiosità io ho un elemento string: string token; token=strtol(stringa, " "); in token ho il primo token, come faccio a convertirlo in intero? Grazie a tutti, ciao ciao. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Usa le string C++ (riga è una string)... Se i campi sono separati da spazio è banale:
istringstream iss(riga); iss >> campo1 >> campo2 >> campo3; Ad esempio puoi inserire queste istruzioni in mezzo ad un ciclo che legge riga per riga da uno stream con getline(stream, riga); |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
In questo mod per estrarre un numero da una stringa potre fare così:
int a; string riga="3 pippo"; istringstream iss(riga); iss>>a ? Se Avessi una stringa con un numero di token non conosciuto che condizione dovrei mettere nel ciclo? string alfa; while(condizione){ iss>>alfa; } Ti ringrazio per le risposte esaustive, sono utilissime. Grazie, ciao ciao. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Così:
Codice:
#include <sstream>
#include <iostream>
#include <string>
using namespace std;
int main()
{
istringstream iss("Questa è una prova");
string s;
while(!iss.fail())
{
iss >> s;
cout << s << endl;
}
return 0;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:17.



















