Quais são os tipos de string mais usados ​​em C++ e como converter entre eles?

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

  •  09-09-2019
  •  | 
  •  

Pergunta

OU Como não se matar ou matar alguém na próxima vez que o compilador C++ torcer seu braço para converter entre dois tipos de string arbitrários apenas para mexer com você?

Tenho dificuldade em codificar em C++, pois estou acostumado com VB6, C#, Ruby, para operações com strings.Mas agora passei mais de 30 minutos tentando registrar uma string contendo 2 guias e uma string na janela de depuração...E não está ficando mais fácil e eu já conheci RPC_WSTR, std::wstring e LPCWSTR

Existem regras simples (ou alguma) para saber as conversões entre eles?Ou isso só acontece depois de anos de tortura?

Basicamente, estou procurando os tipos de string usados ​​com mais frequência em APIs padrão e bibliotecas específicas do MS/Visual C++;O que fazer da próxima vez, eu vejo

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

Atualizar:Corrigi o erro de compilação ^^^^.Estou procurando uma resposta mais global, não a solução para um problema específico que listei como exemplo.

Foi útil?

Solução

Existem dois tipos de string integrados:

  • Strings C++ usam a classe std::string (std::wstring para caracteres largos)
  • Strings no estilo C são ponteiros const char const char*) (ou const wchar_t*)

Ambos podem ser usados ​​em código C++.A maioria das APIs, incluindo o Windows, são escritas em C e, portanto, usam ponteiros char em vez da classe std::string.

A Microsoft esconde ainda essas dicas por trás de uma série de macros.

LPCWSTR é um Ponteiro longo para uma string const larga, ou em outras palavras, um const wchar_t*.

LPSTR é um Ponteiro longo para string, ou em outras palavras, um char* (não constante).

Eles têm um punhado a mais, mas devem ser bem fáceis de adivinhar quando você conhece os primeiros.Eles também têm variantes *TSTR, onde o T é usado para indicar que podem ser caracteres regulares ou largos, dependendo se o UNICODE está habilitado no projeto.LPCTSTR resolve para LPCWSTR se UNICODE estiver definido e LPCSTR caso contrário.

Então, na verdade, ao trabalhar com strings, você só precisa conhecer os dois tipos que listei no início.O resto são apenas macros para várias variantes da versão do ponteiro char.

Converter de um ponteiro char em uma string é simples:

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

E a outra maneira não é muito difícil:

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

Aquilo é, std::string usa uma string de estilo C como argumento no construtor.E tem um c_str() função de membro que retorna uma string no estilo C.

Algumas bibliotecas comumente usadas definem seus próprios tipos de string e, nesses casos, você terá que verificar a documentação para saber como elas interoperam com as classes de string "adequadas".

Você geralmente deve preferir o C++ std::string classe, pois, diferentemente dos ponteiros char, eles comportar-se como cordas.Por exemplo:

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.

Outras dicas

Aqui está um artigo isso cobre o que você precisa principalmente para CString

OutputDebugStringW (myString.c_str ());

Bem-vindo ao C++ ;-)

Você pode simplesmente criar uma função wrapper que aceite um std::string.Em seguida, na função, extraia a string estilo c e passe para OutputDebugStringW.

std::wstring e std::string são apenas apelidos para std::basic_string<wchar_t> e std::basic_string<char>.

Ambos têm um .c_str()-método que retorna um ponteiro de string C convencional (LPCWSTR etc.) e um construtor que usa uma string C.

Você pode querer dar uma olhada CStdString.É uma implementação CString C++ padrão de plataforma cruzada que se converte para a maioria dos outros tipos de string com bastante facilidade.Faz com que quase todas as dores de cabeça relacionadas a strings desapareçam e seja apenas um arquivo de cabeçalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top