2010-04-16 806 views
15

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?

+1

Gracias por la unanimidad std :: string feelings everyone! – physicsmichael

+1

¿Por qué reinventar la rueda? Use la clase de cadenas. – rocknroll

Respuesta

28

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.

+5

La facilidad de uso es la razón número 1 para mí. –

+4

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() –

1

Use std::string. Tendrás menos problemas (creo que casi ninguno, al menos ninguno viene a mi mente) con tamaños de búfer.

1

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]

+2

Y si la biblioteca es "coja" y no admite cadenas , siempre hay std :: string :: c_str()! – physicsmichael

1

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.

+3

Hay 'std :: string :: c_str()' por este motivo. – swegi

+0

@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 ' y convertirlo a 'std :: string' como lo necesite. –

+0

@James McNellis, eso es para lo que es const_cast. – mch

10

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?

+0

No estoy de acuerdo con eso. Por el contrario: siempre toma una 'cadena' (o al menos una plantilla' basic_string ') porque simplemente es mejor que' char * '. Si el usuario tiene una matriz en bruto de 'char', entonces eso también funciona:' string' es convertible de 'char *'. A la inversa, no funciona. 'char' está aquí solo para compatibilidad con el código C, para aceptar un único carácter sin procesar y para los casos en los que se necesita específicamente un elemento de datos de tamaño 1. – wilhelmtell

+5

' 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. –

+3

@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. –

0

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.

Cuestiones relacionadas