티스토리 뷰

목차

    반응형

    MFC CString 합치기, 분리하기, GetBuffer 사용하기, 예제 3종


    MFC GetBuffer CString


    MFC CString 합치기, 분리하기


    MFC CString, 기본적인 형태


    1
    2
    3
    4
    5
    6
    7
    8
    CString data1 = "a";
    CString data2;
    CString result;
     
    int num = 12;
    data2.Format("%d", num);
     
    result = data1 + data2; 
    cs


    변수 a가 문자열일 경우,


    1
    2
    3
    4
    CString data1 = "a";
    CString result; int num = 12;
     
    result.Format("%s%d", data1, num); 
    cs

    변수 a가 문자일 경우,


    1
    2
    3
    4
    char data1 = 'a';
    CString result; int num = 12;
     
    result.Format("%c%d", data1, num); 

    cs


    앞에 나오는 문자가 항상 한 자리일 경우,


    1
    2
    3
    4
    5
    CString result = "a12";
    CString data1; int num = 0;
    data1.Format("%.1s", result);
     
    num = atoi((const char *)result + 1); 
    cs


    MFC CString 문자열


    MFC CString GetBuffer()


    1. ATL CString의 메서드 GetBuffer는 사용상 주의사항이 있습니다.

    GetBuffer를 썼을 때 ReleaseBuffer를 호출해주지 않으면 문자열 길이 오류로 이어집니다.


    반드시 GetBuffer를 쓴 후에는 ReleaseBuffer를 쓰십시오. 아니면 CStrBuf 클래스를 이용해서 자동 ReleaseBuffer가 호출되게 만들어야 합니다. (MFC CString::GetBuffer(), CString::GetBuffer(0)으로는 메모리 할당 안 됨)


    2. GetBuffer는 꼭 필요한 경우가 아니면 호출하지 말아야 합니다.

    GetBuffer는 내부적으로 문자열 버퍼를 재조립하는 기능이 있어서, 느린 성능을 내기 때문입니다.


    GetBuffer가 꼭 필요한 경우란, 문자열 버퍼에 뭔가를 수정하고자 할 경우에 뿐입니다. 만약 문자열 버퍼의 내용을 읽기만 할 것이라면 GetBuffer를 쓰면 안 됩니다.


    Proud.String과 MFC CString은 문자열 버퍼 포인터(wchar_t* or char*)로의 캐스팅 오퍼레이터가 내장되어 있습니다. 따라서 문자열 객체 자체를 wchar_t* or char*으로 캐스팅하면 자동으로 문자열 버퍼 포인터가 리턴됩니다.


    만약 LHS(좌항)이 문자열 버퍼 포인터를 요구하는 경우 캐스팅 문구를 별도로 안 넣어도 자동 캐스팅되므로 편리하게 쓸 수 있다는 점도 참고하세요.

    올바른 사용 예)


    1
    2
    3
    4
    5
    6
    7
    CStringA a;
    a=”abc”;
    puts(a);
     
    CString cs( "c:\\windows\\system32\\directx\\dinput\\joystick" );
    PathRenameExtension(cs.GetBuffer(MAX_PATH), ".ini"); // MAX_PATH = 260
    cs.ReleaseBuffer();
    cs


    잘못된 예)


    1
    2
    3
    4
    5
    6
    7
    CString cs( "c:\\" ); // internal buffer size approx 5 bytes
    PathAppend( cs.GetBuffer(), "windows\\system32\\directx\\dinput\\joystick.ini" ); // buffer overrun
    cs.ReleaseBuffer();
     
    CString cs( "c:\\windows\\system32\\directx\\dinput\\joystick.ini" ); // internal buffer size approx 53 bytes
    PathStripPath( cs.GetBuffer() ); // stays within bounds
    cs.ReleaseBuffer();
    cs


    puts 자체가 문자열 버퍼 포인터를 입력받는 함수이고, a는 문자열 버퍼 포인터 캐스팅 메서드를 가지고 있습니다.


    그래서 a의 버퍼 내용이 puts에 전달됩니다.

    즉, puts(a);는 puts((LPCSTR)a);와 똑같이 해석됩니다. 다음과 같은 코드는 갈굼으로 이어집니다.


    MFC CString 합치기, 분리하기, GetBuffer 사용하기, 예제 3종

    반응형