Cuando necesito escanear valores de varias cadenas, a menudo me encuentro recurriendo a C sscanf()
estrictamente debido a su simplicidad y facilidad de uso. Por ejemplo, de manera muy sucinta puedo tirar un par de valores dobles de una cadena con:Más segura, fácil de usar y flexible alternativa de C++ a sscanf()
string str;
double val1, val2;
if (sscanf(str.c_str(), "(%lf,%lf)", &val1, &val2) == 2)
{
// got them!
}
Esto, obviamente, no es muy C++. No necesariamente lo considero una abominación, pero siempre estoy buscando una mejor manera de hacer una tarea común. Entiendo que el "modo C++" para leer cadenas es istringstream
, pero el tipeo extra requerido para manejar los paréntesis y la coma en la cadena de formato de arriba simplemente lo hace demasiado engorroso para hacer que quiera usarlo.
¿Hay una buena manera de doblar las instalaciones integradas a mi voluntad de una manera similar a la anterior, o hay una buena biblioteca de C++ que hace lo anterior de una manera más segura? Parece que Boost.Format realmente ha resuelto el problema de salida de una buena manera, pero no he encontrado nada similar para la entrada.
Eh, realmente hubiera esperado que Boost tuviera algo aquí. Ahora mis dedos están ansiosos por hacer una biblioteca propia para ello ... –
FWIW, considero que sscanf es tan "C++" como cualquier otra cosa, solo tiene capacidad limitada (pero no tan sintácticamente horrible como iostreams). He visto propuestas para implementar las funciones de formato C en términos de plantillas variadic (por lo tanto C++ 11 solamente). Esto sería una gran mejora si se pudiera realizar. Un buen proyecto pequeño: avíseme cuando lo haya terminado. ; ^) – mcmcc
@mcmcc: en realidad, implementar 'printf' con plantillas variadic es bastante fácil, aparte de los argumentos posicionales. Esperaría el mismo problema con 'sscanf'. Aparte de eso, no veo un problema en el rendimiento. En todo caso, la inclusión parcial podría ser realmente beneficiosa aquí. –