2008-09-25 16 views
17

¿Cuál es tu forma favorita de usar cadenas en C++? Una matriz estilo C de char s? O wchar_t? CString, std::basic_string, std::string, BSTR o CComBSTR?¿Cómo se manejan las cadenas en C++?

Ciertamente, cada una de ellas tiene su propia área de aplicación, pero de todos modos, que es su favorito y por qué?

+0

Lea las preguntas frecuentes http://stackoverflow.com/faq Ra. Este es un gran ejemplo de una pregunta abierta que requiere mucha discusión. Downvoted. –

+1

No estoy de acuerdo con Onorio: es una gran pregunta para alguien que no sabe qué sistema de cadenas usar entre todas las opciones. Upvoted para cancelar el voto a favor de Onorio :) –

+0

Debe especificar si está buscando una solución multiplataforma o solo una específica de Windows. Esto es muy importante. – sorin

Respuesta

32

std :: string o std :: wstring, según sus necesidades. ¿Por qué?

  • Son estándar
  • Son portátiles
  • Pueden manejar I18N
  • Tienen garantías de rendimiento (según la norma)
  • Protegido contra desbordamientos de búfer y ataques similares
  • Se pueden convertir fácilmente a otros tipos según sea necesario
  • Están muy bien modelados, ofreciéndole una amplia variedad de opciones a la vez que reducen la saturación del código y mejoran actuación. De Verdad. Los compiladores que no pueden manejar plantillas ya no existen.

Una matriz de caracteres tipo C solo está pidiendo problemas. Todavía tendrá que lidiar con ellos de vez en cuando (y eso es para lo que std :: string.c_str() es), pero, sinceramente, uno de los mayores peligros en C es que los programadores hagan cosas malas con char * y terminen con desbordamientos de búfer. Simplemente no lo hagas.

Una matriz de wchar__t es lo mismo, simplemente más grande.

CString, BSTR y CComBSTR no son estándar y no son portátiles. Evítelos a menos que sea absolutamente forzado. De manera óptima, solo conviértelos std :: string/std :: wstring cuando sea necesario, lo que no debería ser muy costoso.

Tenga en cuenta que std :: string es solo un elemento secundario de std :: basic_string, pero aún así es mejor utilizar std :: string a menos que tenga una buena razón para no hacerlo. Realmente bueno. Deje que el compilador se ocupe de la optimización en esta situación.

+0

Si lo que desea evitar es desbordamientos de pila, entonces no almacene sus arreglos de caracteres C en la pila. Guárdalos en el montón. Ahí; problema resuelto. A menos que quieras decir desbordamientos de búfer. – tzot

+0

Oops, me refiero a buffer obviamente. Reparado, gracias. – Zathrus

+0

¿Qué significa 'un hijo de' aquí? – fizzer

2

arrays de char C-estilo tienen su lugar, pero si se utilizan extensivamente que están pidiendo a perder el tiempo de depuración de errores por uno. Tenemos nuestra propia clase de cadena adaptada para su uso en nuestro (entorno de desarrollo integrado).

No usamos std :: string porque no siempre está disponible para nosotros.

6

std :: cadena a menos que necesite llamar a una API que toma específicamente uno de los otros que enumeró.

4

Si puede usar MFC, use CString. De lo contrario, use std :: string. Además, std :: string funciona en cualquier plataforma que admita C++ estándar.

+0

En realidad, los compiladores integrados pueden omitir el encabezado y cumplir con los estándares. –

+0

Recomendaría MFC solo si está obligado a usarlo. Es horrible, y además de eso, es un Framework con un montón de demandas que un escritor de aplicaciones deberá cumplir. Simplemente no está en el lado derecho de la relación costo/beneficio. –

+1

MFC puede ser bastante doloroso a veces, pero la clase CString no es realmente mala. Tampoco necesita incluir todo el equipo MFC para usarlo. Está disponible en QBziZ

8

std :: string !!

Hay una razón por la que lo llaman un "Estándar".

basic_string es un detalle de implementación y debe ser ignorado.

BSTR & CComBSTR solo para interOp con COM, y solo para el momento de interoperabilidad.

2

utilizo std::string (o basic_string<TCHAR>) siempre que puedo. Es bastante versátil (al igual que CStringT), es seguro (a diferencia de printf) y está disponible en todas las plataformas.

2

Otro, std :: wstring.

std :: string es tecnología del siglo XX. Use Unicode y venda a 6 mil millones de personas en lugar de 300 millones.

+0

wstring tampoco es realmente compatible con Unicode, excepto si solo desarrolla para Windows –

1

Me gusta usar TCHAR que es una definición para wchar o char de acuerdo con la configuración del proyecto. Se define en tchar.h donde puede encontrar todas las definiciones relacionadas para las funciones y tipos que necesita.

1

std :: string y std :: wstring si puedo, y algo más si tengo que hacerlo.

Puede que no sean perfectos, pero están bien probados, bien entendidos y son muy versátiles. Juegan muy bien con el resto de la biblioteca estándar, que también es una gran ventaja.

También vale la pena mencionar, stringstreams.

1

Unicode es el futuro. No use char * y std :: string. Por favor) Estoy cansado de los errores de localización.

+2

Es perfectamente posible mantener cadenas Unicode en std :: string. Simplemente codifícalos como UTF-8. De hecho, a menudo es una solución mucho mejor que utilizar wstring si se dirige a diferentes sistemas operativos. –

+0

Sí, pero esto solo sirve para almacenar. Necesita desplegar sus propios métodos para las operaciones basadas en caracteres en lugar de las basadas en caracteres. –

1

std :: string es mejor que nada, pero es molesto que le falta la funcionalidad básica como dividir, unir e incluso una llamada de formato decente ...

+0

eso es lo que son las cadenas de caracteres –

+0

La biblioteca Boost StringAlgo proporciona mucho de eso. –

3

Cuando tengo una opción (por lo general no) , que tienden a utilizar std :: string con codificación UTF-8 (y la ayuda de UTF8 CPP biblioteca. No es que me gusta std :: string que mucho, pero al menos es estándar y portátil.

Desafortunadamente, en casi todos los proyectos de la vida real en los que he trabajado, han sido clases internas de cadenas, la mayoría de ellas realmente mejores que std :: string, pero aún así ...

+0

No había visto esa biblioteca antes, parece que podría ser útil. –

3

Soy un desarrollador de Qt, así que por supuesto tiendo a utilizar QString siempre que sea posible :).

es bastante agradable: compatible con Unicode, hilo de seguridad implícita de intercambio (también conocido como copy-on-write), y viene con una API diseñada para resolver problemas del mundo real prácticos (dividir, unir, reemplazar (con y sin regex), conversión a/de números ...)

Si no puedo usar QString, entonces std :: wstring. Si estás atascado con C, recomiendo glib GString.

1

Depende de su aplicación ... He realizado una gran cantidad de programación incrustada y generalmente utilizo matrices de caracteres. Crear un nuevo objeto de cadena toma ciclos de reloj que se desperdician para la mayoría de mis manipulaciones de cadenas.

2

Si está utilizando MFC, use CString. De lo contrario, estoy de acuerdo con la mayoría de los demás, std :: string o std :: wstring todo el camino.

Microsoft podría haber hecho un gran favor al mundo al agregar std :: basic_string < TCHAR> sobrecargas en su última actualización de MFC.

Cuestiones relacionadas