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

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종

댓글(0)

Designed by JB FACTORY