Tengo un problema que sscanf resuelve (extraer elementos de una cadena). No me gusta el sscanf, ya que no es seguro y es viejo y horrible. Quiero ser inteligente y usar algunas partes más modernas de la biblioteca estándar de C++. ¿Qué debería usar en su lugar?¿Qué debo usar en lugar de sscanf?
Respuesta
creo que las otras respuestas no viene al caso. La pregunta no es sobre I/O, se trata de extraer datos de una cadena.
Try stringstream:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
cómo saber si c no está allí, por ejemplo, la cadena fue "123 456"? – unludo
@unludo: En ese caso, 'c' no se modificaría. Podría inicializar 'c' con un valor predeterminado, o podría necesitar un análisis más sofisticado. Un tokenizer probablemente funcione. –
A partir de C++ 11, 'c' se restablecería a' 0' y, antes de eso, creo que su valor posterior a la falla no estaba definido. De todos modos, para verificar si 'c' está allí use el estado de la corriente (por conveniencia, de' operator bool() '):' if (s >> a >> b) if (s >> c) abc_there(); else ab_there(); else didnt_have_a_and_b(); '. –
fgets o strtol
Si incluye sstream
tendrá acceso a las clases stringstream que proporcionan flujos de cuerdas, que es lo que necesita. Roguewave tiene buenas examples on how to use it.
Para la mayoría de puestos de trabajo flujos estándares hacen el trabajo a la perfección,
std::string data = "AraK 22 4.0";
std::stringstream convertor(data);
std::string name;
int age;
double gpa;
convertor >> name >> age >> gpa;
if(convertor.fail() == true)
{
// if the data string is not well-formatted do what ever you want here
}
Si necesita herramientas más potentes para el análisis más complejo, entonces usted podría considerar la expresión regular o incluso Espíritu de Boost.
Si realmente desea no utilizar transmisiones (es bueno debido a la legibilidad), puede usar StringPrintf.
puede encontrar su aplicación en la locura:
https://github.com/facebook/folly/blob/master/folly/String.h#L165
Buen código (ya estoy usando algo casi igual), aunque es un reemplazo para 'printf' en lugar de' sscanf'. –
- 1. ¿Qué debo usar en lugar de printf en Perl?
- 2. ¿Qué debo usar en lugar de windows.h en Linux?
- 3. ¿Debo usar String en lugar de TFilename?
- 4. ¿Debo usar Varnish en lugar de nginx?
- 5. ¿Debo usar NoSQL en lugar de MySQL?
- 6. ¿Cómo usar sscanf en loops?
- 7. Cómo usar sscanf correcta y segura
- 8. Usar stringstream en lugar de `sscanf` para analizar una cadena de formato fijo
- 9. ¿Qué metainformaciones debo usar?
- 10. ¿Qué DB debo usar?
- 11. ¿Cuándo debo usar print en lugar de echo en PHP?
- 12. (¿Por qué) debo usar ofuscación?
- 13. ¿Qué palabra lectora debo usar en nltk?
- 14. ¿Cuándo debo usar un UserControl en lugar de una página?
- 15. ¿Qué debo usar en lugar de glTexCoordPointer() en OpenGL ES 2.0?
- 16. sscanf en dobles
- 17. Gui toolkits, ¿qué debo usar?
- 18. OAuth/OpenID: ¿qué debo usar?
- 19. ¿Qué Game Engine debo usar?
- 20. nodejs: ¿qué usar en lugar de require.paths?
- 21. ¿Qué puedo usar en lugar de eval()?
- 22. ¿Qué podemos usar en lugar de nstimer?
- 23. sharedDispatcher no se encuentra en CCTouchDispatcher (Cocos2D 2.0 beta2), ¿qué debo usar en su lugar?
- 24. java.net.URLEncoder.encode (String) está en desuso, ¿qué debo usar en su lugar?
- 25. ¿en qué contexto debo usar AlertDialog.Builder?
- 26. Escapar de corchetes] en sscanf
- 27. ¿Qué doble debo usar en VIM?
- 28. ¿Por qué debo usar "Recursos" en WPF?
- 29. ¿Qué puedo usar en lugar de un Vector en Java?
- 30. ¿Qué comillas debo usar en CSS?
¿Por qué tratar de ser "inteligente"? –
Por ejemplo, por la razón que dijo, ese sscanf no es seguro para tipos. – jalf
@Kaleb Pederson: para muchos hablantes de inglés, "inteligente" puede significar "inteligente" y no tiene la connotación negativa que a veces tiene en los Estados Unidos. Tenga en cuenta que Ben Hymers es del Reino Unido. – Naaff