본문 바로가기
C++ 200제/코딩 IT 정보

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

by vicddory 2018. 10. 20.

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종

댓글