¿Cuáles son los tipos de cadenas más utilizados en C ++ y cómo convertir entre ellos?

StackOverflow https://stackoverflow.com/questions/944516

  •  09-09-2019
  •  | 
  •  

Pregunta

o cómo no mata a sí mismo o alguien que la próxima vez que el compilador de C ++ tuerce el brazo para convertir entre 2 tipos de cadenas arbitrarias sólo para meterse con usted?

Tengo un momento difícil de codificación en C ++, ya que estoy acostumbrado a VB6, C #, Ruby, para operaciones de cadenas. Pero ahora he pasado más de 30 minutos tratando de conectarse una cadena que contiene 2 guids y una cadena en la ventana de depuración ... y no se ha hecho más fácil Y ya he conocido a RPC_WSTR, std::wstring y LPCWSTR

¿Hay sencilla (o ningún) reglas para saber las conversiones entre ellos? ¿O es que sólo vienen después de años de tortura?

Básicamente estoy buscando los tipos de cadena utilizadas con mayor frecuencia en ambas API estándar y bibliotecas MS-específicas / Visual C ++; Lo que debe hacer la próxima vez, veo

Error   8   error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR'

Actualizar : He arreglado el ^^^^ error de compilación. Busco a una respuesta más global no para la solución de problema específico que se enumeran como ejemplo.

¿Fue útil?

Solución

Hay dos tipos incorporados de cadena:

  • C ++ cadenas utilizan el std :: string clase (std :: wstring de caracteres anchos)
  • cuerdas
  • C-estilo son punteros const char * const char) (o const wchar_t*)

Ambos pueden ser utilizados en código C ++. La mayoría de la API de Windows, incluidos están escritos en C, y por lo que usan los punteros de char en lugar de la clase std :: string.

Microsoft esconde aún más estos punteros detrás de un número de macros.

LPCWSTR es un puntero largo a una amplia Const cadena , o en otras palabras, un const wchar_t*.

LPSTR es un puntero largo de cadena , o en otras palabras, un char* (no const).

Tienen un puñado más, pero debe ser bastante fácil de adivinar una vez que conozca estos primeros. También tienen * TSPR variantes, donde se utiliza el T para indicar que esto podría ser caracteres, ya sea regular o de ancho, dependiendo de si UNICODE está habilitada en el proyecto. LPCTSTR tiene por LPCWSTR si UNICODE se define, y LPCSTR lo contrario.

Así que en realidad, cuando se trabaja con cadenas, sólo tiene que conocer los dos tipos que se enumeran en la parte superior. El resto son sólo macros para diferentes variantes de la versión puntero char.

La conversión de un puntero char a una cadena es simple:

const char* cstr = "hello world";
std::string cppstr = cstr;

Y a la inversa, no es mucho hader:

std::string cppstr("hello world");
const char* cstr = cppstr.c_str();

Es decir, std::string toma una cadena de estilo C como un argumento en el constructor. Y tiene una función miembro c_str() que devuelve una cadena de estilo C.

Algunas bibliotecas de uso común definir sus propios tipos de cadenas, y en esos casos, se tendrá que comprobar la documentación de la forma en que interoperar con las clases de cuerda "apropiados".

Por regla general deberá preferir la clase ++ std::string C, ya que, a diferencia de los punteros de carbonilla, que comportan como cadenas. Por ejemplo:

std:string a = "hello ";
std:string b = "world";
std:string c = a + b; // c now contains "hello world"

const char* a = "hello ";
const char* b = "world";
const char* c = a + b; // error, you can't add two pointers

std:string a = "hello worl";
char b = 'd';
std:string c = a + b; // c now contains "hello world"

const char* a = "hello worl";
char b = 'd';
const char* c = a + b; // Doesn't cause an error, but won't do what you expect either. the char 'd' is converted to an int, and added to the pointer `a`. You're doing pointer arithmetic rather than string manipulation.

Otros consejos

Aquí está una artículo que cubre lo que necesita principalmente para CString

OutputDebugStringW (myString.c_str ());

Bienvenido a C ++; -)

Sólo puede crear una función de contenedor que acepta un std::string. Luego, en la función de extraer la secuencia de c-estilo y pasar a OutputDebugStringW.

std::wstring y std::string son sólo alias para std::basic_string<wchar_t> y std::basic_string<char>.

Ambos tienen una .c_str()-método que devuelve un puntero C-cadena convencional (LPCWSTR etc.) y un constructor que toma un C-string.

Es posible que desee ver en CStdString . Es un estándar de C ++ multiplataforma aplicación CString que convierte a la mayoría de los otros tipos de cadenas con bastante facilidad. Hace casi todos los dolores de cabeza relacionados con la cadena desaparecen y es sólo un archivo de cabecera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top