문자열(CString)에서 특정한 문자 찾기

 

  • Find() 함수 
    • 문자열에서 특정한 문자의 순서를 리턴함, 단 특정한 문자가 없을지 -1을 리턴함
	CString temp = _T("abc");
	int tempint = temp.Find(_T("a")); //0
	tempint = temp.Find(_T("b")); //1
	tempint = temp.Find(_T("c")); //2
	tempint = temp.Find(_T("d")); //-1 

 

int <-> CString

int nNum = 5;

CString strNum

 

char -> int

nNum = atoi(strNum);

 

CString -> int

strNum.Format(_T("%d"), nNum); 

 

int <-> CString 

nNum = _ttoi(strNum);  

 

%c : 단일문자

%d : 부호있는 10진 정수

%i  : 부호있는 10진 정수, %d와 같음

%f  : 부호있는 실수 (float 아니다 double이고 소수점은 기본 6자리까지 표시됨)

%s : 문자열

%o : 부호없는 8진 정수

%u : 부호없는 10진 정수

%x : 부호없는 16진 정수(소문자)

%X : 부호없는 16진 정수(대문자)

%e : e 표기법에 의한 실수

%p : 포인트

%#010x : 주소

 

 

CString <-> const char*

[ CString -> const char* ]

CString str1 = _T("안녕하세요");
const char* str2;
str2 = (CStringA) str1;


[ const char* -> CString ]

const char* str1 = "안녕하세요";
CString str2;
str2 = (CString)str1; 

 

CString <-> wchar_t

 // CString -> wchar_t *  
 CStringW aaa(_T("hello!"));
 wchar_t *a = (wchar_t *)aaa.GetBuffer();


//비추
 wchar_t wTemp[1024] = L"\0";
 MultiByteToWideChar(CP_ACP, 0, m_szNotice,m_szNotice.GetLength(),wTemp,1024);

 
 // wchar_t *  -> CString 변환
 wchar_t *aaa = L"Hello, World!";
 CString temp(aaa);   
 m_szText = temp;

 

'MFC' 카테고리의 다른 글

[MFC] 현재 실행파일(.exe)의 위치 반환  (0) 2020.07.06
[MFC] CString에서 특정한 문자 찾기 Find함수  (0) 2020.07.02
C++ MFC CString  (0) 2020.06.26
[MFC] 응답없음 처리  (0) 2020.06.25
[MFC] ProgressBar  (0) 2020.06.25

CString은 MFC에서 문자열을 처리를 아주 쉽게 처리할 수 있도록 제공해주는 클래스

 

1)문자열로  CString 개체 만들기

CString temp = _T("test");

CString temp2 = _T("test2");

 

2)CString의 개별문자 접근 : GetAt() , SetAt()

 

3) CString 개체 연결 : +, +=

CString s1 = _T("a");

s1 += _T("b");

CString s2 =_T("c");

CString message = s1 + _T("d") + s2 ; 

 

4)CString 개체를 비교. Compare(), CompareNoCase()

관계형 연산자를 사용하여 두 값을 비교가능.

 

5)CString을 C스타일의 null로 종료되는 문자열 사용

CString 개체를 C스타일 문자열로 변환가능. 단, LPCSTR타입으로 캐스팅해야함. 

ex)

CString tmp = "test";

char tmpChar[256];

strcpy(tmpChar,(LPCTSTR)tmp);

 

ex에서 CString은 C스타일의 null로 종료되는 읽기 전용 문자열에 대한 포인터를 반환.!

strcpy함수는 C스타일문자열 복사본을 tmp변수에 저장.

 

ex)

CString tmp = (_T("test"));

int sizeStr = (tmp.GetLength() + 1) ;

LPTSTR lpsz = new TCHAR[sizeStr];

_tcscpy_s(lpsz,sizeSTr,tmp); 

 

strcpy_s /_tcspy_s 의 세번 째인수는 const wchar_t*(유니코드) 혹은 const char* (ANSI)인데 여기 예제에서는 CString을 전달함. 

 

 

 

 

 



출처: https://kwonkyo.tistory.com/94 [EveryX]



 

'MFC' 카테고리의 다른 글

[MFC] CString에서 특정한 문자 찾기 Find함수  (0) 2020.07.02
[MFC] 자주 쓰이는 형변환  (0) 2020.06.30
[MFC] 응답없음 처리  (0) 2020.06.25
[MFC] ProgressBar  (0) 2020.06.25
[MFC] LPSTR과 LPCTSTR  (0) 2020.06.25

원인) 다이얼로그 사용자 이벤트 메시지 처리하는 부분과 함수 실행 부분이 단일 쓰레드로 실행되어 메시지 파이프라인을 공유하기 때문에 함수처리가 끝나기 전까지는 메시지 처리가 안되기 때문

 

방법1) 오래걸리는 loop 부분에 쓰레드로 처리한다.(분산)

 

방법2) 다음의 코드를 삽입한다.

MSG msg;
 while(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
 {
  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
 }

 

'MFC' 카테고리의 다른 글

[MFC] 자주 쓰이는 형변환  (0) 2020.06.30
C++ MFC CString  (0) 2020.06.26
[MFC] ProgressBar  (0) 2020.06.25
[MFC] LPSTR과 LPCTSTR  (0) 2020.06.25
[MFC] 문자열(MULTI BYTE/UNICODE) / CString  (0) 2020.06.24

SetRange(low,high) : low~high 값 셋팅

SetPos(result) : 현재 값 변경

'MFC' 카테고리의 다른 글

C++ MFC CString  (0) 2020.06.26
[MFC] 응답없음 처리  (0) 2020.06.25
[MFC] LPSTR과 LPCTSTR  (0) 2020.06.25
[MFC] 문자열(MULTI BYTE/UNICODE) / CString  (0) 2020.06.24
[MFC] Const char* 이란  (0) 2020.06.24

ofstream os(Test.txt, ios::xxx);

 ios::app

Test.txt 파일이 이미 존재하면 내용을 보존하고 파일 끝에서부터 쓰여진다. 파일이 없다면 새로 만든다.

 ios::ate

..?

 ios::binary

 이진수 형태로 쓰거나 읽음

 ios::in

파일을 읽고 파일이 없으면 안됨.

 ios::out

덮어쓰기를 실행. 즉 이미 존재하면 내용을 지우고 작성

 

중복된 파일 존재 여부 체크

 

중복된 파일을 존재 여부를 체크하기 보다는 파일을 제일 처음 쓸 때는 이 전 내용을 전부 삭제하고 작성

이어서 쓸 때는 app을 이용하여 마지막부터 씀

 

 

LPSTR = long pointer string = char *
LPCSTR = long pointer constant string = const char *

LPCTSTR = long pointer constant t_string = const tchar *

LPWSTR = long pointer wide string = w_char *
LPCWSTR = long pointer constant wide string = const w_char *

C/C++은 string을 compiler차원에서 지원하지 않음.

Windows에서는 이런 string처리를 위해서 char* 형을 그대로 쓰기보다는 LPCSTR 등의 표현

 

LP (long pointer) + STR (string) : 윈도 시절 16bit 과거 windows3.1에서 까지는 모두 16bit였고,

24bit 메모리를 long pointer라는 것으로 extended memory라는 이름으로 관리

 

LPCSTR (long pointer constant string = const char *)

LP(Long Pointer)는. Net에서는 64bit pointer를, VC++6.0과 그 이전 버전에서는 32bit pointer를 나타냄

C contant는 함수의 내부에서 인자 값을 변경하지 말라는 뜻.

STR은 말 그대로 string자료가 될 것이라는 뜻으로 내부적으로는 char형 배열에 null값 종료를 의미를 의함.

 

LPCTSTR = long pointer constant t_string = const tchar *

char는 1Byte이고 wide char는 2Byte 포인터 연산을 많이 하는 c, c++코드는 호환성에 치명적인 문제 발생
그래서 컴파일러가 precompile option을 보고. 환경에 맞게 동작하는 코드를 작성할 수 있는 새로운 변수 모양의 Macro를 선언 --> TCHAR, t_char 

 

t_char의 유용성 type casting

운영체제가 multi-byte환경이면, char형으로,
unicode환경이면, w_char, wide char형으로 

https://wantairpod.tistory.com/7

LPWSTR = long pointer wide string = w_char *
LPCWSTR = long pointer constant wide string = const w_char *

W는 wide char를 나타냅니다. 즉 unicode

 

(LPSTR)(LPCTSTR) 형 변환 (char *)(const char *)와 같은 말

 

 

 

출처 : Tong – lcyblue님의 C++통

 


 

 

'MFC' 카테고리의 다른 글

[MFC] 응답없음 처리  (0) 2020.06.25
[MFC] ProgressBar  (0) 2020.06.25
[MFC] 문자열(MULTI BYTE/UNICODE) / CString  (0) 2020.06.24
[MFC] Const char* 이란  (0) 2020.06.24
[MFC] Edit Control  (0) 2020.06.24
path.Format(_T("%s"), szBuffer); // int->cstring 변경시
MessageBox(_T("경로 입력하세요")); //메시지박스 이용시

 멀티 바이트

  • ASCII는 영어, 숫자, 부호 등 128개의 문자를 1바이트로 표현하도록 구성된 코드이다.
  • 1바이트는 8비트인데 데이터 타입이 sign인 경우 최상위 비트 1개는 부호 판별용으로 사용되어 데이터로 쓸 수 있는 나머지 7비트를 10진수로 (=2^7) 나타내면 128이다.
  • 따라서 ASCII는 1바이트만 사용하도록 만들어져서 원래는 128개의 문자만 사용할 수 있는 것이다. 그런데 한글도 써야 하고 여러 다른 문자들도 써야 하는데 1바이트는 너무 부족해서 한 바이트를 더 추가해서 통 2바이트로 문자 집합을 구성하고 멀티 바이트라고 정의하게 되었다.
  • 영어는 1바이트, 한글은 2바이트를 확보
  • ""(멀티 바이트)

유니코드

  • 유니코드는 첨부터 2바이트 문자열로 컴퓨터에서 사용하는 모든 문자를 포함하도록 만들어졌다.
  • L""(유니코드) --> 이 경우 내부 프로젝트 설정을 멀티 바이트로 바꾸면 문제가 생깁니다.
  • 문자 하나당 무조건 2바이트의 공간을 확보.

 

멀티바이트 및 유니코드 문제 해결

TEXT()/_T() 매크로 사용

결국 전처리기를 따라가면 다음과 같이 나타낸다.

#ifdef _UNICODE
 #define __T(x)      L ## x
#else
 #define __T(x)      x
#endif

ex)

MessageBox(_T("경로 입력하세요")); //메시지 박스 이용시
path.Format(_T("%s"), szBuffer); //포멧 변경시

 

CString

typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;

TCHAR라는 타입은 프로젝트 설정에 의존적인 타입이고, CStringW, CStringA는 프로젝트 설정에 상관없이 한 가지 문자 타입을 사용하는 것

보통 사용할 때는 CString을 사용하는 것이 좋음.

특정 라이브러리를 사용할때 해당 라이브러리가 특정 문자열을 지원한다고 하면 선택적으로 CStringW, CStringA 사용.

CString str_T("asdfg"); // 프로젝트 설정에 알맞은 문자열이 타입이 될 것임

 

 

__ttoi  : CString->int함수

 

 

 

기본 string

  • wstring(유니코드)
  • wchar_t src [] = L"asdf" ; 앞에 L을 써주면 유니코드화로 변환
  • TCHAR src[] = _T("sdf"); : _T("")을 사용하면 설정에 맞게 유니코드 또는 멀티 바이트 코드로 자동 변환.
기본 유니코드      
string wstring      
char wchar
ex) wchar_t src[]=
L"ASDF" ; 
앞에 L을 써주면 유니코드화 됨.
TCHAR

 : 멀티바이트 문자, 유니코드 문자등으로 자동 변환.
ex) TCHAR src[] =
_T("asdf");
_T()를 사용하면 설정에 맞게 유니코드 또는 멀티바이트 코드로 자동으로 변환.
     
         

 

'MFC' 카테고리의 다른 글

[MFC] ProgressBar  (0) 2020.06.25
[MFC] LPSTR과 LPCTSTR  (0) 2020.06.25
[MFC] Const char* 이란  (0) 2020.06.24
[MFC] Edit Control  (0) 2020.06.24
[MFC] 응용프로그램 종류(기본옵션)  (0) 2020.06.24

+ Recent posts