C++에서 가장 많이 사용되는 문자열 유형은 무엇이며 이들 유형 간에 변환하는 방법은 무엇입니까?

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

  •  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 구현입니다.거의 모든 문자열 관련 문제를 해결하고 헤더 파일이 하나뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top