2010-09-16 1 views
5

Voglio sapere le posizioni del "_" in una stringa:Come posso rilevare "_" in una stringa C++?

string str("BLA_BLABLA_BLA.txt"); 

Qualcosa di simile:

string::iterator it; 
for (it=str.begin() ; it < str.end(); it++){ 
if (*it == "_")   //this goes wrong: pointer and integer comparison 
{ 
    pos(1) = it; 
} 
cout << *it << endl; 
} 

Grazie, André

+5

Provare a utilizzare le virgolette singole anziché le virgolette doppie. –

+0

@Dominic perché non è questa una risposta? – Motti

+0

@Motti - è ora (vedere la risposta di sbi http://stackoverflow.com/questions/3725574/detect-in-a-string/3725671#3725671) –

risposta

6

Si può fare uso della funzione find come:

string str = "BLA_BLABLA_BLA.txt"; 
size_t pos = -1; 

while((pos=str.find("_",pos+1)) != string::npos) { 
     cout<<"Found at position "<<pos<<endl; 
} 

uscita:

Found at position 3 
Found at position 10 
+0

La risposta è sbagliata. Indipendentemente dal fatto che si fornisca o meno una posizione iniziale, 'std :: string :: find' restituirà la posizione * nella stringa *. La riga 'pos + = found + 1' dovrebbe essere cambiata in' pos = found + 1', e mentre ci sei, l'intera variabile 'found' può essere rimossa inizializzando' pos' in '-1', passando 'pos + 1' a' find' e memorizza il valore di ritorno in 'pos'. Prova con "BLA_BLABLA_BLA_BLA.txt", rileverà solo i primi due "_". –

9
std::find(str.begin(), str.end(), '_'); 
           // ^Single quote! 
16

Nota che "_" è un stringa letterale, mentre '_' è un personaggio letterale.

Se si dereference un iteratore in una stringa, quello che si ottiene è un carattere. Naturalmente, i personaggi possono essere confrontati solo per carattere letterali, per non stringa letterali.

Tuttavia, come altri hanno già notato, non si dovrebbe implementare un tale algoritmo te stesso. È stato eseguito un milione di volte, due delle quali (std::string::find() e std::find()) sono terminate nella libreria standard del C++. Usa uno di quelli.

+2

+1 per aver menzionato il problema * attuale * che sta avendo. –