CString 형변환

WindowsPrograming : 2009. 8. 19. 22:22
반응형
출처 : http://rainbird.springnote.com/pages/152001?print=1

CString 형변환

CString -> BYTE

BYTE*   temp;
CString   cmd;
에서 cmd 의 값을 temp에 할당하려 할때.

 

temp=new BYTE[255];
temp=(LPBYTE)(LPCSTR)cmd;
delete []temp;

 

or

 

CString str = _T("abcd");
BYTE* pbyte = new BYTE[256];
int nSize;
nSize = str.GetLength();
CopyMemory( pbyte, str.GetBuffer(nSize), nSize );
pbyte[nSize] = 0;

 

or

 

strcpy(szNamePlace,(LPCTSTR)name);


or

 

CString str = "string";
BYTE* pByte;
pByte = (BYTE*)(LPTSTR)(LPCTSTR)str;

 

BYTE -> CString

CString testString;
BYTE    testByte;
testString.Format( "%s", testByte );

 

CString -> BYTE *

CString name = "몽룡이";
BYTE byte[26] = {0};
BYTE bName[26] = {0x0,};

sprintf((char*)byte, "%s", name);

memcpy(bName, byte, 26);

 

CString strTmp1, strTmp2;
strTmp1 = "";
strTmp2 = "";

for(int i=0; i<26; i++) {
    strTmp1.Format("%02X ", bName[i]);
    strTmp2 += strTmp1;
}
MessageBox(strTmp2, "", 0);

 

26바이트의 크기의 이름이다. 남는 공간은 0으로 채워진다

 

CString -> int

CString의 문자열을 바로 숫자로 바꾸는것은
아직 보지 못했습니다.
아마 atoi()나 atod()의 C함수를 사용해야 될것 같네요.
도움말을 참고하세요.

 

int -> CString

CString str;
int i = 6;
str.Format("%d",i);    // str에 6의 문자가 들어갑니다.


BYTE -> int, int -> BYTE

바로 형변환으로 가능합니다.
bt = (BYTE)i;          // 주의 : 작은 크기로 들어가기 때문에
                       // 255 이상의 값은 엉뚱하게 동작하겠지요.
i = (int)bt;

 

CString  => char* 변환

char * ch;
CString *str;

1) ch = (LPSTR)(LPCSTR)str;

2) ch = str.GetBuffer(str.GetLength());
3) wsprintf( ch, "%s", str);

 

 

char*  =>  CString 변환

1) str = (LPCSTR)(LPSTR)ch;
2) str = ch;

 

참고)

LPSTR 은 char* 입니다.

LPSTR : char stirng의 32비트 포인터, char* 와 같다.

LPCTSTR : Constant character String의 32비트 포인터

UINT : 32비트 unsigned형 정수
DWORD : unsigned long int형

BYTE : 8비트 unsigned 정수

 

1.CString 클래스의 GetBuffer()는 CString을 char *로 바꿔줍니다.

ex) CString strTemp = _T("test");
    char *getTemp=NULL;

    getTemp = malloc(strTemp.GetLength()+1);
    strcpy(getTemp, strTemp.GetBuffer(strTemp.GetLength());
    printf("결과:%sn", getTemp);

    free(getTemp);

2. operator LPCTSTR ()도 마찬가지입니다.

ex) CString strTemp = _T("test");
    char *getTemp = (LPSTR)(LPCSTR)strData;

 


CString -> BYTE*

CString str="1234";

BYTE *pbyte;

pbyte = (BYTE(LPSTR)(LPCSTR)str;


CString str = _T("abcd");

BYTE* pbyte = new BYTE[256];

int nSize;

nSize = str.GetLength();

CopyMemory( pbyte, str.GetBuffer(nSize), nSize );

pbyte[nSize] = 0;

 

CString  => char* 변환

char * ch;
CString *str;

1) ch = (LPSTR)(LPCSTR)str;

2) ch = str.GetBuffer(str.GetLength());
3) wsprintf( ch, "%s", str);

 

char*  =>  CString 변환

1) str = (LPCSTR)(LPSTR)ch;
2) str = ch;

 

참고)

LPSTR 은 char* 입니다.

LPSTR : char stirng의 32비트 포인터, char* 와 같다.

LPCTSTR : Constant character String의 32비트 포인터

UINT : 32비트 unsigned형 정수
DWORD : unsigned long int형

BYTE : 8비트 unsigned 정수

 

참고 : CString을 const char* 형태로 변경 -> (LPTSTR)(LPCTSTR)CString


LPCSTR :  A 32-bit pointer to a constant character string.
LPSTR :  A 32-bit pointer to a character string.
LPCTSTR :  A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
LPTSTR :  A 32-bit pointer to a character string that is portable for Unicode and DBCS.

 

CString from MSDN

http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vccore/html/_core_Strings3a_CString_Operations_Relating_to_C2dStyle_Strings.asp

 

대개 CString 개체의 내용은 마치 해당 개체가 C 스타일의 null로 끝나는 문자열인 것처럼 조작하는 것이 유용합니다. 이 문서에서는 다음과 같은 내용을 다룹니다.

C 스타일의 Null로 끝나는 문자열로 변환

다음 두 가지 경우를 참고하십시오.

  • 가장 간단한 경우 CString 개체를 LPCTSTR로 캐스팅할 수 있습니다. LPCTSTR 형식 변환 연산자는 CString 개체에서 null로 종료되는 읽기 전용 C 스타일 문자열에 대한 포인터를 반환합니다.

    LPCTSTR에서 반환하는 포인터는 CString에서 사용하는 데이터 영역을 가리킵니다. CString이 범위를 벗어나 자동적으로 삭제되거나 다른 이유로 CString의 내용이 변경되면 LPCSTSR 포인터는 더 이상 유효하지 않습니다. 포인터가 가리키는 문자열은 임시 문자열로 처리됩니다.

  • SetAt 등의 CString 함수를 사용하여 문자열 개체의 개별 문자를 수정할 수 있습니다. 그러나 직접 수정할 수 있도록 CString 개체의 문자 복사본이 필요한 경우에는 다음 예제에서처럼 strcpy(또는 이식 가능한 유니코드/MBCS 함수인 _tcscpy)를 사용하여 문자를 안전하게 수정할 수 있는 별도의 버퍼에 CString 개체를 복사합니다.
    CString theString( "This is a test" );


    LPTSTR lpsz = new TCHAR[theString.GetLength()+1];


    _tcscpy(lpsz, theString);


    //... modify lpsz as much as you want
    참고 strcpy(또는 이식 가능한 유니코드/MBCS 함수인 _tcscpy)의 두 번째 인수는const wchar_t*(유니코드) 또는 const char*(ANSI)입니다. 위 예제에서는 이 인수에 대해 CString을 전달합니다. C++ 컴파일러에서는 자동으로 CString 클래스에 대해 정의된 변환 함수를 적용하여 CString을 LPTSTR로 변환합니다. 한 형식을 다른 형식으로 캐스팅하는 연산을 정의하는 기능은 C++에서 가장 유용한 기능 중 하나입니다.

표준 런타임 라이브러리 문자열 함수 사용

대부분의 경우, strcmp(또는 이식 가능한 유니코드/MBCS 함수인 _tcscmp) 등의 표준 C 런타임 라이브러리 문자열 함수를 사용하여 문자열 작업을 수행하려면 CString 멤버 함수를 찾아야 합니다.

C 런타임 문자열 함수를 사용해야 하는 경우에는 C 스타일의 Null로 끝나는 문자열로 변환에서 설명하는 방법을 사용하여, CString 개체를 해당하는 C 스타일 문자열 버퍼로 복사하고 이 버퍼에서 작업을 수행한 다음 결과로 생성된 C 스타일 문자열을 다시 CString 개체에 할당할 수 있습니다.

CString 내용을 직접 수정

대부분의 경우 CString 개체의 내용을 수정하거나 CString을 C 스타일 문자열로 변환하려면 CString 멤버 함수를 사용해야 합니다.

그러나 문자 버퍼가 필요한 운영 체제 함수를 사용하여 작업하는 등의 일부 경우에는 CString의 내용을 직접 수정하는 것이 좋습니다.

GetBuffer 및 ReleaseBuffer 멤버 함수를 사용하면 CString 개체의 내부 문자 버퍼에 액세스하여 CString의 내용을 직접 수정할 수 있습니다. 다음 단계는 이러한 함수를 사용하여 CString의 내용을 직접 변경하는 방법입니다.

  1. CString 개체에 대해 GetBuffer를 호출하고 필요한 버퍼 길이를 지정합니다.
  2. GetBuffer에서 반환된 포인터를 사용하여 문자를 CString 개체에 직접 씁니다
  3. CString 개체에 대해 ReleaseBuffer를 호출하여 문자열 길이 등의 내부 CString 상태 정보를 모두 업데이트합니다. CString 개체의 내용을 직접 수정한 다음 다른 CString 멤버 함수를 호출하려면 먼저 ReleaseBuffer를 호출해야 합니다.

가변 인수를 사용하는 함수에 CString 개체 사용

일부 C 함수에는 다양한 인수가 사용됩니다. 대표적인 예로 printf 함수가 있습니다. 이러한 종류의 함수를 선언하는 방식 때문에 컴파일러에서는 인수의 형식을 확인하지 못해 각 인수에 대해 수행할 변환 작업을 결정하지 못할 수 있습니다. 따라서 다양한 인수를 사용하는 함수에 CString 개체를 전달할 때는 명시적인 형식 캐스팅을 사용해야 합니다.

가변 인수를 사용하는 함수에 CString 개체를 사용하려면

  • 다음과 같이 CString을 LPCTSTR 문자열로 명시적으로 캐스팅합니다.
    CString kindOfFruit = "bananas";


    int howmany = 25;


    printf( "You have %d %s\n", howmany, (LPCTSTR)kindOfFruit );

CString 형식 매개 변수 지정

문자열 인수가 필요한 함수의 경우에는 대부분 함수 프로토타입에 CString 대신 문자(LPCTSTR)에 대한 const 포인터로 형식 매개 변수를 지정하는 것이 좋습니다. 형식 매개 변수가 문자에 대한 const 포인터로 지정되면 TCHAR 배열에 대한 포인터, 리터럴 문자열 ["hi there"] 또는 CString 개체 중 하나를 전달할 수 있습니다. CString 개체는 자동으로 LPCTSTR로 변환됩니다. LPCTSTR을 사용할 수 있는 위치이면 어디에나 CString 개체를 사용할 수 있습니다.

인수가 수정되지 않는 경우에는 형식 매개 변수를 상수 문자열 참조, 즉 const CString&로 지정할 수도 있습니다. 문자열이 함수에 의해 수정되는 경우에는 const 한정자를 삭제합니다. 기본 null 값이 필요하면 다음 예제에서처럼 null 문자열[""]로 초기화합니다.

void AddCustomer( const CString& name,


const CString& address,


const CString& comment = "" );

대부분의 함수 결과에서 CString 개체를 간단히 값으로 반환할 수 있습니다.

 

CString 인수 전달 규칙

클래스 인터페이스를 정의할 때는 멤버 함수에 대한 인수 전달 규칙을 결정해야 합니다. CString 개체를 전달하고 반환하는 데는 몇 가지 표준 규칙이 있습니다. 함수 입력에 사용하는 문자열함수 출력에 사용하는 문자열에 설명된 규칙을 따르면 효율적이고 올바른 코드를 만들 수 있습니다.

함수 입력에 사용하는 문자열

문자열을 함수에 입력하려면 대부분의 경우에는 문자열 함수 매개 변수를 LPCTSTR로 선언하는 것이 가장 좋습니다. 필요하면 생성자와 할당 연산자를 사용하여 함수 내에서 CString 개체로 변환합니다. 함수로 문자열 내용을 변경할 수 있도록 하려면 매개 변수를 상수가 아닌 CString 참조(CString&)로 선언합니다.

함수 출력에 사용하는 문자열

CString 개체는 기본 형식처럼 값 의미론 다음에 오므로 일반적으로 함수에서 CString 개체를 반환할 수 있습니다. 읽기 전용 문자열을 반환하려면 상수 CString 참조(const CString&)를 사용합니다. 다음 예제에서는 CString 매개 변수와 반환 형식의 사용 방법을 보여 줍니다.

class CName : public CObject


{


private:


CString m_firstName;


char m_middleInit;


CString m_lastName;


public:


CName() {}


void SetData( LPCTSTR fn, const char mi, LPCTSTR ln )


{


m_firstName = fn;


m_middleInit = mi;


m_lastName = ln;


}


void GetData( CString& cfn, char mi, CString& cln )


{


cfn = m_firstName;


mi = m_middleInit;


cln = m_lastName;


}


CString GetLastName()


{


return m_lastName;


}


};


...


CName name;


CString last, first;


TCHAR middle;


name.SetData( "John", 'Q', "Public" );


ASSERT( name.GetLastName() == "Public" );


name.GetData( first, middle, last );


ASSERT( ( first == "John" ) && ( last == "Public" ) );


...

반응형

'WindowsPrograming' 카테고리의 다른 글

PostMessage  (0) 2009.07.15
[Windows Programing]char, wchar_t, TCHAR, CString 클래스  (0) 2009.05.09
파일오픈, 세이브  (0) 2008.04.21
Posted by Real_G