Какие строковые типы наиболее часто используются в C ++ и как конвертировать между ними? - PullRequest
4 голосов
/ 03 июня 2009

ИЛИ Как не убить себя или кого-нибудь в следующий раз, когда компилятор C ++ выкручивает вам руку, чтобы конвертировать между двумя произвольными типами строк, просто чтобы связываться с вами?

У меня тяжелое время на C ++, так как я привык к VB6, C #, Ruby для строковых операций. Но теперь я потратил более 30 минут, пытаясь записать строку, содержащую 2 направляющих и строку, в окно отладки ... и это не становится легче И я уже встречал RPC_WSTR, std::wstring и LPCWSTR

Существуют ли простые (или какие-либо) правила, позволяющие узнать о переходах между ними? Или это только после многих лет пыток?

В основном я ищу наиболее часто используемые строковые типы как в стандартных API, так и в библиотеках для MS / Visual C ++; Что делать в следующий раз, я вижу

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

Обновление : я исправил ошибку компиляции ^^^^. Я ищу более глобальный ответ, а не решение конкретной проблемы, которое я перечислил в качестве примера.

Ответы [ 6 ]

9 голосов
/ 03 июня 2009

Существует два встроенных типа строки:

  • Строки C ++ используют класс std :: string (std :: wstring для широких символов)
  • Строки в стиле C являются указателями const char const char *) (или const wchar_t*)

Оба могут использоваться в коде C ++. Большинство API, включая Windows, написаны на C, поэтому они используют указатели на символы, а не класс std :: string.

Microsoft также скрывает эти указатели за рядом макросов.

LPCWSTR - это длинный указатель на строку с широким константным расширением , или, другими словами, const wchar_t*.

LPSTR - это Длинный указатель на строку , или, другими словами, char* (не const).

Их немного больше, но их будет довольно легко угадать, когда вы узнаете эти первые несколько. У них также есть варианты * TSTR, где T используется для указания того, что это может быть обычный или широкий символ в зависимости от того, включен ли в проекте UNICODE. LPCTSTR преобразуется в LPCWSTR, если определен UNICODE, и LPCSTR в противном случае.

Так что на самом деле, при работе со строками вам просто нужно знать два типа, которые я перечислил вверху. Остальные - просто макросы для различных вариантов версии указателя символа.

Преобразовать из указателя на строку просто:

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

И другой способ не слишком хадер:

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

То есть std::string принимает строку в стиле C в качестве аргумента в конструкторе. И у него есть c_str() функция-член, которая возвращает строку в стиле C.

Некоторые часто используемые библиотеки определяют свои собственные строковые типы, и в этих случаях вам нужно будет проверить документацию на предмет их взаимодействия с «правильными» строковыми классами.

Обычно вы предпочитаете класс C ++ std::string, так как, в отличие от указателей на символы, они ведут себя как строки. Например:

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.
2 голосов
/ 03 июня 2009

Вот статья , которая охватывает то, что вам нужно в основном для CString

1 голос
/ 03 июня 2009
OutputDebugStringW (myString.c_str ());
0 голосов
/ 04 июня 2009

Возможно, вы захотите взглянуть на CStdString . Это кроссплатформенная стандартная реализация C ++ CString, которая довольно легко конвертируется в большинство других типов строк. Снимает почти все головные боли, связанные со строками, и это всего лишь один заголовочный файл.

0 голосов
/ 03 июня 2009

std::wstring и std::string являются просто псевдонимами для std::basic_string<wchar_t> и std::basic_string<char>.

Оба имеют .c_str() -метод, который возвращает обычный указатель C-строки (LPCWSTR и т. Д.) И конструктор, который принимает C-строку.

0 голосов
/ 03 июня 2009

Добро пожаловать в C ++; -)

Вы можете просто создать функцию-оболочку, которая принимает std::string. Затем в функции извлеките строку в стиле c и перейдите к OutputDebugStringW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...