2010-03-21 18 views
10

¿Se recomienda usar cstdio, cstring, cmath en C++? Estaba escribiendo un programa que necesitaba pow, strlen y sprintf ... para eso la única forma en que podía hacerlo era incluir estos 3 encabezados. ¿Hay una mejor forma de C++ para hacerlo?¿Se recomienda usar cstdio, cstring, cmath, etc. en C++?

Gracias

+1

Me parece que está escribiendo C, simplemente usando un compilador de C++. Si usa C++, argumentaría que debería usar las características de manipulación IO de la biblioteca estándar junto con stringstream en lugar de sprintf, y usar la clase de cadenas C++ en lugar de las cadenas estilo C. "Necesitas" strlen() y sprintf() porque estás tratando con cadenas C. –

Respuesta

5

Eso es la forma correcta.

+0

No estoy seguro de que estoy de acuerdo con esto :) Parece que está tratando con cadenas de estilo C, no con cadenas de C++. La pregunta que tengo es: ¿no debería estar usando std :: basic_string en lugar de cadenas terminadas NULL junto con las características de manipulación IO de C++ en lugar de sprintf? aplausos :) –

10

Puede usar std::stringstream en lugar de sprintf y std::string en lugar de cadenas estilo C. Pero C++ simplemente usa la biblioteca C para funciones matemáticas.

C++ añade algunas sobrecargas convenientes para funciones matemáticas (por ejemplo, se puede utilizar exp() para el flotador.) Están disponibles en <math.h> no sólo en <cmath> sin embargo.

+0

Hay muchas cosas útiles además de sprintf en string.h –

+2

Pero todo es para usar cadenas de caracteres *. Si cambias a la clase de cadena de C++, obtienes todo en el encabezado de la cadena. (O.K., a veces es posible que también necesite un algoritmo) Y es preferible usar una cadena de C++ que una char * si es posible. – Shiroko

+0

string.h tiene algunas funciones que no son de cadena, como memcpy y memset. – dan04

3

Para las funciones matemáticas, <cmath> es la forma correcta; sin embargo, para E/S, debe usar <iostream>, <sstream>, <fstream>, y sus amigos. Para la manipulación de cadenas, <cadena> es el camino a seguir.

+0

iostream es mucho más lento que scanf/printf (experiencia acm olympiads) – osgx

+0

@osgx, no estoy seguro de que compre eso. scanf/printf tiene que lidiar con mucho más formato que iostreams. ¿Qué implementación usaste? Cualquier implementación razonable de iostream debe ser al menos tan rápida. –

+0

en nuestro problema olymp fue con 'sync_with_stdio'. El iostream de libccdC++ de gcc tiene esto habilitado en Linux. Después de desactivar esta velocidad de iostream – osgx

1

cmath no se reemplaza realmente en C++, ya que realmente no hay nada que los mejore. Sin embargo, stringstreams/iostreams son muy superiores al cstring y cstdio lot.

Si tiene una cadena en C, puede convertir a std :: string con bastante facilidad, y lo mismo para la espalda. Si está usando cadenas, SIEMPRE use las librerías de cadenas C++ sobre strlen, sprintf y eso.

Cuestiones relacionadas