티스토리 뷰
목차
MFC CString 합치기, 분리하기, GetBuffer 사용하기, 예제 3종
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); |
앞에 나오는 문자가 항상 한 자리일 경우,
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 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종