Estoy un poco confuso sobre las formas básicas en que los programadores codifican de manera diferente en C y C++. Una cosa en particular es el uso de cadenas en C++ sobre arreglos de char, o viceversa. Entonces, ¿debería usar cadenas o matrices de caracteres, en general, y por qué?C++: ¿Debo usar cadenas o matrices de caracteres, en general?
Respuesta
En C++, en casi todos los casos, debe usar std::string
en lugar de una matriz de caracteres sin procesar.
std::string
gestiona la memoria subyacente para usted, que es en sí misma una buena razón para preferirla.
También proporciona una interfaz mucho más fácil de usar y más legible para operaciones de cadenas comunes, p. pruebas de igualdad, concatenación, operaciones de subcadenas, búsqueda e iteración.
La facilidad de uso es la razón número 1 para mí. –
Podría mencionar que la principal excepción es la interfaz con las bibliotecas C existentes, e incluso aquellas que solo requieren entrada pueden tomar un const char * de your_string.c_str() –
Use std::string
. Tendrás menos problemas (creo que casi ninguno, al menos ninguno viene a mi mente) con tamaños de búfer.
C tiene char [] mientras que C++ ha std :: string también ...
que comúnmente entendido que uno debe "abrazar la lengua" y, siguiendo esa regla, se debe utilizar std :: string ..
Sin embargo, es más o menos lo que la biblioteca está utilizando, ¿cómo es que la biblioteca quiere que exprese sus cadenas, cosas por el estilo.
std :: string es una clase de contenedor, y en su interior, es un char []
Si utiliza std :: string, usted tiene muchas ventajas, como las funciones que le ayudarán a [comparar, substr, como ejemplos]
Y si la biblioteca es "coja" y no admite cadenas , siempre hay std :: string :: c_str()! – physicsmichael
Otros lo han puesto. Use std :: string todo lo que sea posible. Sin embargo, hay áreas donde necesita caracteres *, por ejemplo, si desea llamar a algunos servicios del sistema.
Hay 'std :: string :: c_str()' por este motivo. – swegi
@swegi: muchas API esperan un 'char *' y no un 'const char *' (por ejemplo, la mayoría, si no todas, de WinAPI). Sin embargo, en estos casos, es una buena idea usar un 'std :: vector
@James McNellis, eso es para lo que es const_cast. – mch
Si está modificando o devolviendo la cadena, use std::string
. De lo contrario, acepte su parámetro como const char*
a menos que necesite absolutamente las funciones de miembro std::string
. Esto hace que su función sea utilizable no solo con std::string::c_str()
sino también con literales de cadena. ¿Por qué hacer que su interlocutor pague el precio de construir un std::string
con almacenamiento en montón solo para pasarlo en un literal?
No estoy de acuerdo con eso. Por el contrario: siempre toma una 'cadena' (o al menos una plantilla' basic_string
' cadena' no es convertible de 'char *'. 'string' es construible a partir de' char * ', y causa la asignación de montón y la fragmentación. (Por favor, no disminuya a menos que tenga una respuesta a la última oración de mi respuesta). Y al revés, funciona bien con la función de miembro 'c_str()' (que es lo que ya mencioné en mi respuesta). Y los punteros no están allí solo por compatibilidad con versiones anteriores, ni por contener valores únicos. Por el contrario, son excelentes iteradores y todos los algoritmos de la biblioteca estándar están cuidadosamente diseñados para funcionar correctamente si los iteradores son punteros. –
@Ben: +1 Me gusta esta idea, aunque no la he visto usar mucho en la práctica. Supongo que depende de cómo termines usando la cadena. Técnicamente, 'string' _is_ convertible from' char * ': un constructor de un solo parámetro no explícito es un" constructor de conversión "y cae dentro de la categoría de conversiones definidas por el usuario. Eso no significa que llamarlo sea barato, por supuesto. –
Como es el caso con todo lo que elijas depende de lo que estés haciendo con él. std :: string tiene un valor real si se trata de datos de cadenas que cambian. No se puede vencer a char [] por eficiencia cuando se trata de cadenas inalterables.
- 1. ¿Debo usar Hypens, Underscore o camelCase en matrices php?
- 2. Asignar cadenas a matrices de caracteres
- 3. Cadenas y codificación de caracteres en C++
- 4. Matrices de cadenas en Managed C++
- 5. C/C++ caja de conmutadores en matrices de caracteres
- 6. ¿Debo usar escapes php quote para comillas simples o usar comillas dobles en matrices?
- 7. ¿Debo usar doble o flotar?
- 8. ¿Debo usar int o UInt16?
- 9. Cuándo usar vectores y cuándo usar matrices en C++?
- 10. ¿Qué plataforma debo usar: C++ nativo o C#?
- 11. ¿Cuál es la precedencia de los caracteres al ordenar en MySQL, PHP o simplemente en general?
- 12. Debo usar DataInputStream o BufferedInputStream
- 13. ¿Debo usar byte o int?
- 14. ¿Debo usar AppDomain.CurrentDomain.BaseDirectory o System.Environment.CurrentDirectory?
- 15. ¿Debo usar Flash o Flex?
- 16. ¿Debo usar alias o alias_method?
- 17. ¿Debo usar em o px?
- 18. ¿Debo usar CouchDB o SimpleDB?
- 19. ¿Debo usar multiplicación o división?
- 20. ¿Debo usar eval() o call_user_func()?
- 21. ¿Debo usar herencia o composición?
- 22. ¿Debo usar horquilla o hilos?
- 23. ¿Debo usar Pilones o Pirámide?
- 24. Objetos de C++: ¿Cuándo debo usar el puntero o referencia
- 25. ¿Debo usar ArrayList o IList
- 26. ¿Debo usar Phobos o Tango?
- 27. ¿Debo usar Meteor.startup() o $ (function() {})
- 28. Numpy: ¿Debo usar newaxis o None?
- 29. ¿Debo elegir == o eq para comparar cadenas en EL?
- 30. Reemplazo de caracteres en cadenas en VB.NET
Gracias por la unanimidad std :: string feelings everyone! – physicsmichael
¿Por qué reinventar la rueda? Use la clase de cadenas. – rocknroll