Существует два встроенных типа строки:
- Строки 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.