C++에서 가장 많이 사용되는 문자열 유형은 무엇이며 이들 유형 간에 변환하는 방법은 무엇입니까?
-
09-09-2019 - |
문제
또는 다음에 C++ 컴파일러가 2개의 임의 문자열 유형 사이를 변환하기 위해 팔을 비틀었을 때 자신이나 누군가를 죽이지 않는 방법은 무엇입니까?
문자열 작업에 VB6, C#, Ruby에 익숙하기 때문에 C++로 코딩하는 데 어려움을 겪습니다.하지만 지금은 2개의 GUID와 문자열이 포함된 문자열을 디버그 창에 기록하는 데 30분 이상을 소비했습니다.그리고 그것은 더 쉬워지지 않고 이미 만났습니다. RPC_WSTR
, std::wstring
그리고 LPCWSTR
그들 사이의 변환을 알 수 있는 간단한(또는 임의의) 규칙이 있습니까?아니면 수년간의 고문 끝에 나온 걸까요?
기본적으로 저는 표준 API와 MS 관련/Visual C++ 라이브러리 모두에서 가장 자주 사용되는 문자열 유형을 찾고 있습니다.다음엔 뭘 해야 하나, 알겠어
Error 8 error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR'
업데이트:^^^^ 컴파일 오류를 수정했습니다.예시로 나열한 특정 문제에 대한 솔루션이 아닌 보다 포괄적인 답변을 찾고 있습니다.
해결책
내장된 문자열 유형에는 두 가지가 있습니다.
- C++ 문자열은 std::string 클래스를 사용합니다(와이드 문자의 경우 std::wstring).
- C 스타일 문자열은 const char 포인터 const char*)(또는
const wchar_t*
)
둘 다 C++ 코드에서 사용할 수 있습니다.Windows를 포함한 대부분의 API는 C로 작성되므로 std::string 클래스가 아닌 char 포인터를 사용합니다.
Microsoft는 이러한 포인터를 여러 매크로 뒤에 숨깁니다.
LPCWSTR은 Const Wide 문자열에 대한 긴 포인터, 즉, const wchar_t*
.
LPSTR은 문자열에 대한 긴 포인터, 즉, char*
(const 아님).
몇 가지가 더 있지만 처음 몇 가지만 알면 추측하기가 꽤 쉬울 것입니다.또한 *TSTR 변형도 있습니다. 여기서 T는 프로젝트에서 UNICODE가 활성화되었는지 여부에 따라 일반 문자 또는 와이드 문자일 수 있음을 나타내는 데 사용됩니다.LPCTSTR은 UNICODE가 정의된 경우 LPCWSTR로 해석되고, 그렇지 않으면 LPCSTR로 해석됩니다.
따라서 실제로 문자열을 사용하여 작업할 때 맨 위에 나열한 두 가지 유형만 알면 됩니다.나머지는 char 포인터 버전의 다양한 변형에 대한 매크로일 뿐입니다.
char 포인터를 문자열로 변환하는 것은 간단합니다.
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
클래스는 char 포인터와 달리 행동하다 문자열로.예를 들어:
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.
다른 팁
여기에는 기사 주로 CString에 필요한 내용을 다룹니다.
OutputDebugStringW (myString.c_str ());
C++에 오신 것을 환영합니다 ;-)
다음을 허용하는 래퍼 함수를 만들 수 있습니다. std::string
.그런 다음 함수에서 C 스타일 문자열을 추출하여 다음으로 전달합니다. OutputDebugStringW
.
std::wstring
그리고 std::string
에 대한 별칭일 뿐입니다. std::basic_string<wchar_t>
그리고 std::basic_string<char>
.
둘 다 .c_str()
-기존 C-문자열 포인터를 반환하는 메서드(LPCWSTR
등) 및 C 문자열을 사용하는 생성자입니다.
당신은보고 싶을 수도 있습니다 CStdString.이는 대부분의 다른 문자열 유형으로 매우 쉽게 변환되는 크로스 플랫폼 표준 C++ CString 구현입니다.거의 모든 문자열 관련 문제를 해결하고 헤더 파일이 하나뿐입니다.