2011-02-08 13 views

Respuesta

6

std::string tiene un método rfind(); que le dará el último . A partir de ahí es un simple substr() para obtener la cadena "100".

+0

y usa atoi para obtener el número entero de la cadena. –

+3

@Benoit Thierry: Prefiero usar 'stoi' en realidad, o' lexical_cast'. –

+0

¿Querías 'strtol'? Esa es la alternativa estándar a 'atoi'. – MSalters

3
const std::string s("7.8.9.1.5.1.100"); 
const size_t i = s.find_last_of("."); 
if(i != std::string::npos) 
{ 
    int a = boost::lexical_cast<int>(s.substr(i+1).c_str()); 
} 
+1

+1: Prefiero 'find_last_of' to' rfind' aquí, ya que hace que sea más fácil agregar nuevos separadores, p. Ej. 'find_last_of ("., -: ")' – GrahamS

1

Usando C++ 0x expresión regular (o boost::regex) consultar su cadena contra un basic_regex construido a partir de la cadena literal "^7\\.8\\.9\\.1\\.5\\.1\\.(?[^.]*\\.)*(\d+)$". El grupo de captura $1 será útil.

1

con la información actualizada, el siguiente código debe hacer el truco.

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cstdlib> 

int main(void) 
{ 
    std::string base("7.8.9.1.5.1."); 
    std::string check("7.8.9.1.5.1.100"); 
    if (std::equal(base.begin(), base.end(), check.begin()) && check.find('.', base.size()) == std::string::npos) 
    { 
    std::cout << "val:" << std::atoi(check.c_str() + base.size()) << std::endl; 
    } 
    return 0; 
} 

EDIT: actualizado para omitir los casos en los que hay más puntos después del partido, atoi habría todavía se analiza y devuelto el valor hasta el ..

+0

No, no: ¡podría haber otro '.' más en la cadena que se va a verificar! – Benoit

+0

@Benoit: ¿Cómo es eso? ¿No especificó el OP que este era el último punto? – Oystein

+0

Quiere asegurarse de que comience con '7.8.9.1.5.1' y obtener lo que viene después del último punto. Las entradas como '7.8.9.1.5.1.42.55b' no están prohibidas según la pregunta, y la respuesta es" sí, comienza con foo, y la última parte es '55b'". – Benoit

Cuestiones relacionadas