이번에는 CString 형에서 char*형으로 변환하는 방법을 알아보자. 고 생각했는데,

 

다른 블로거께서 딱히 설명 할 필요 없을정도로 아주 자세히 설명해놓으셔서 따로 부가적인 코멘트가 없어도 될듯하다.

 

 

1. 일반 문자열의 형변환 

CString strImagePath = "Normal Method";

char *szLoadImagePath = new char[strImagePath.GetLength() + 1];


sprintf(szLoadImagePath, "%s", strImagePath.GetBuffer());

...

delete []szLoadImagePath;

 

 

2. 경로를 입력해주는 경우의 형변환

CString strImagePath = "C:\\ProgramFiles\\Image\\image.bmp";

char *szLoadImagePath = new char[strImagePath.GetLength() + 1];


sprintf(szLoadImagePath, "%s", strImagePath.GetBuffer());

...

delete []szLoadImagePath;

 

 

3.  함수로부터 경로를 넘겨받는 경우의 형변환

CString strImagePath = m_img.GetImagePath();

strImagePath += "image.bmp";

char szLoadImagePath[256];

wcstombs(szLoadImagePath, (LPCTSTR)strImagePath, 256);

 

일반적인 CString 문자열을 char* 형으로 형변환하고자 한다면 1번 방법을 사용하시면 됩니다. 개발자 코드에서

경로를 직접 입력해줄 경우에는 2번 방법을 사용하시면 됩니다. 하지만, 별도의 함수로부터 경로를 넘겨받을 경우에는

\를 Escape Sequence로 인식하기 때문에 경로를 올바르게 인식하지 않습니다. 그렇다고 일일이 \을 \\으로 변경할 수도

없으므로 3번 방법을 사용하시면 됩니다. wcstombs 함수는 UNICODE 문자열(WCS, Wide Character Set)을 ASCII 문자열(MBCS,

Multy Byte Character Set)로 변환시켜주는 함수 입니다. 이렇게 하면 \을 Escape Sequence로 인식하는 문제를 피할 수 있습니다.

 하지만 3번 방법도 경로에 한글이 포함되어 있을 경우 올바르게 인식하지 않습니다. 비로소 4번 방법을 사용하였을 경우 1,2,3번 

방법에서 나타났던 문제를 모두 해결할 수 있습니다. 



4. 경로에 한글이 포함되어 있을 경우의 형변환

CString strImagePAth = m_img.GetImagePath();

strImagePath += "image.bmp";

char szLoadImagePath[256];


WideCharToMultiByte(CP_ACP, 0, strImagePath.GetBuffer(), -1, szLoadImagePath, 256, NULL, NULL);

 

 

참고로 저같은 경우에는 한글 Windows 8.1 OS를 사용 중인데, 경로중에 한글이 들어가게 되어있다. 그래서 4번을 활용하여 경로찾는 문제를 해결 할 수 있었다.

 

 

 

참고 : http://jsgreatnom.tistory.com/65

 

2014/10/31 - [[ Topics ]/Visual Studio] - CString to int, int to CString 변환법

 

2014/05/01 - [[ Topics ]/Visual Studio] - CString 에서 경로, 파일명, 확장자를 구분하여 출력하는법

 

2014/04/08 - [[ Topics ]/C/C++] - 문자타입간의 데이터 복사방법(wchar_t, char*, LPCTSTR)

 

 

Posted by Tommy™
,

두개의 형변환방법이 엄청 자주 사용된다.

 

사용법은 아래와 같이 아주 간단!

 

 

CString -> int

int형 변수 = _ttoi( CString 변수 );
_ttoi()를 이용


int -> CSting
CString 변수.Format( _t("%d"), int 변수 );
CString의 Format() 메소드를 이용

 

출처 : http://tasia.tistory.com/129

 

 

Posted by Tommy™
,

아주 유용한 소스코드일듯하다.

 

MFC에서 CString형을 이용하여 string을 쉽게 컨트롤 할 수 있다.

 

이때 경로, 파일명, 확장자 등을 구분하여 출력해야하는 상황이 있는데, 이때 해당 소스코드를 활용하면 될듯하다.

 

 

// Type
// 0: 파일 경로만 복사
// 1: 파일 이름만 복사
// 2: 파일 확장자 복사
// 3: 확장자를 뺀 파일명 복사


CString strClip(CString str, int nType)
{
 //파일 Full Path를 복사
 TCHAR szTmp[256];
 StrCpy(szTmp, str);

 //파일의 경로만 복사.
 PathRemoveFileSpec(szTmp);
 CString strTmp = szTmp;

 if(nType == 0)
  return strTmp;

 //파일 이름만 복사
 strTmp = str.Right(str.GetLength()-strTmp.GetLength()-1);

 if(nType == 1)
  return strTmp;

 //파일 확장자 복사
 int i = strTmp.ReverseFind('.');
 CString strTmp2;
 if(i > -1)
 {
  strTmp2 = strTmp.Right(strTmp.GetLength()-i-1);
 }
 else
 {
  strTmp2 = _T("");
 }
 
 
 if(nType == 2)
  return strTmp2;

 //확장자를 뺀 파일명을 복사
 strTmp = strTmp.Left(i);
 if(nType == 3)
  return strTmp;


 return _T("");
}

 

단지 디렉토리 경로일 경우는 파일명에 마지막 디렉토리를 리턴하게 된다.

 

 

참조 : http://blog.naver.com/just720?Redirect=Log&logNo=40206748318

 

 

 

 

 

 

 

 

 

2013/11/26 - [[ Topics ]/MFC] - MFC Edit control 에서 실수형 값 가져오는방법

 

2013/09/05 - [[ Topics ]/MFC] - error C2589 에 대한 고찰과 문제 해결방법

 

2013/07/30 - [[ Topics ]/MFC] - MFC Dialog창을 modaless할때 포커스 옮기는법

 

2012/09/04 - [[ Topics ]/MFC] - MFC 새다이얼로그를 생성시 OnDestroy() 경고 및 Memory Leaks

 

2012/09/03 - [[ Topics ]/MFC] - MFC 다이얼로그 기반 OnIdle()과 KickIdle() 그리고 modaless

 

2010/07/29 - [[ Topics ]/MFC] - MFC에서 글자 출력

 

Posted by Tommy™
,

 

 

 

 

현재 진행중에 있는 프로젝트에서 CString -> wchar_t 으로 변환하여 스트링을 복사해야하는 상황을 맞이하게 되었다.

 

이리저리 찾아보다가, 한 블로그에서 그 실마리를 찾았는데,

 

참조(네이버블로그) : http://blog.naver.com/skywood1?Redirect=Log&logNo=100129022023

 

바로 위에 링크를 건 블로그에서 그 해답을 찾을 수 있었다.

 

 

 

 

size_t mbstowcs(

wchar_t *wcstr,        //Output

const char *mbstr,    //Input

size_t Count            //Size

);

 

해답은 바로 이 함수인데, 멀티바이트 스트링(MBS)을 와이드 캐릭터 스트링(WCS)으로 변경해주는 함수이다.

 

참조(MSDN) : http://msdn.microsoft.com/ko-kr/library/k1f9b8cy.aspx

 

 

 

 

하지만 나는 Cstring 에서 wchar_t로 변경해야하기때문에, 한번 더 변환을 해줘야했다.

 

CString str="test";
char *text = (char*)((LPCSTR)str); 

 

 

 

 

따라서 결과적으로 CString -> char* -> wchar_t총 3번변경을 해줌으로써 문제를 해결할 수 있었다.

 

CString str="Hand/Finger Tracking and Gesture Recognition";
wchar_t wstr[256] = {};

int nLen = str.GetLength()+1;

mbstowcs(wstr,(char*)((LPCSTR)str), nLen);

 

 

 

 

Posted by Tommy™
,