2010-09-16 21 views
5

Quiero saber las posiciones de la "_" en una cadena:¿Cómo detecto "_" en una cadena de C++?

string str("BLA_BLABLA_BLA.txt"); 

Algo así como:

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; 
} 

Gracias, André

+5

Intente utilizar comillas simples en lugar de comillas dobles. –

+0

@Dominic ¿por qué no es esta una respuesta? – Motti

+0

@Motti - es ahora (vea la respuesta de sbi http://stackoverflow.com/questions/3725574/detect-in-a-string/3725671#3725671) –

Respuesta

6

Puede hacer uso de la función find como:

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

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

Salida:

Found at position 3 
Found at position 10 
+0

La respuesta es incorrecta. Independientemente de si proporciona una posición inicial o no, el 'std :: string :: find' devolverá la posición * en la cadena *. La línea 'pos + = found + 1' debe cambiarse a' pos = found + 1', y mientras lo hace, toda la variable 'found' puede eliminarse inicializando' pos' a '-1', pasando 'pos + 1' a' encontrar' y almacenar el valor de retorno en 'pos'. Pruebe con "BLA_BLABLA_BLA_BLA.txt", solo detectará los dos primeros '_'. –

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

Tenga en cuenta que es un "_"cadena literal, mientras '_' es un carácter literal .

Si eliminar la referencia de un iterador en una cadena, lo que se obtiene es un personaje . Por supuesto, los personajes sólo pueden ser comparados con caracteres literales, no cadena literales.

Sin embargo, como ya han notado otros, no debe implementar dicho algoritmo usted mismo. Se ha realizado un millón de veces, dos de los cuales (std::string::find() y std::find()) terminaron en la biblioteca estándar de C++. Usa uno de esos.

+2

+1 por mencionar el problema * real * que está teniendo. –

Cuestiones relacionadas