Mfc 문자열 몇 글자 비교

  • Compare : 대소문자 구분 문자열을 비교 
  • ComparNoCase : 대소문자를 구분하지 않고 문자열을 비교
int Compare(_In_z_ PCXSTR psz) const { ATLENSURE( AtlIsValidString( psz ) ); _Analysis_assume_(psz); // AtlIsValidString guarantees that psz != NULL return( StringTraits::StringCompare( this->GetString(), psz ) ); } int CompareNoCase(_In_z_ PCXSTR psz) const { ATLENSURE( AtlIsValidString( psz ) ); _Analysis_assume_(psz); // AtlIsValidString guarantees that psz != NULL return( StringTraits::StringCompareIgnore( this->GetString(), psz ) ); }
  • psz  :  비교할 문자열
  • return :  문자열이 psz 보다 작을 경우 == -1
               문자열이 psz 와 같을 경우 == 0
               문자열이 psz 보다 큰 경우 == 1

예제코드

CString strTmp(_T("ABCDE")); printf("%d\n", strTmp.Compare(_T("ABCDE"))); printf("%d\n", strTmp.Compare(_T("abcdE"))); printf("%d\n", strTmp.Compare(_T("12345")));

출력화면

C++ 문자열을 다루다 보면 문자열의 일부를 추출해야 하는 상황이 있습니다.

예를 들어, 파일의 확장자 부분만 추출하고 싶을 때 부분 문자열 추출이 필요합니다.

C++ string 클래스는 부분 문자열 추출을 위한 substr()이라는 메소드를 가지고 있습니다.

string 클래스의 substr()을 활용하는 방법을 알아보겠습니다.

string::substr()은 다음과 같은 형태의 함수입니다.

string substr (size_t pos = 0, size_t len = npos) const;

시작 지점(pos)과 길이(len)를 전달받아서 부분 문자열을 리턴합니다.

기본값으로 pos는 0으로 지정되어 있으며 len은 npos가 지정되어 있습니다.

len은 문자열의 마지막 문자보다 더 긴 길이가 입력되면 문자열의 마지막 문자까지만 리턴하도록 처리되어 있습니다.

그렇기 때문에 파라미터를 입력하지 않으면 기본적으로 전체 문자열을 리턴합니다.

또한 string::substr()은 항상 새로운 메모리를 할당해서 리턴합니다.

다음과 같은 예제로 동작을 확인할 수 있습니다.

#include <iostream> #include <string> int main() { std::string numbers = "0123456789"; std::string full = numbers.substr(); std::string sub = numbers.substr(3, 5); std::cout << "Full String: " << full << std::endl; std::cout << "Sub String: " << sub << std::endl; }

아무것도 입력하지 않고 호출하는 경우 동일한 문자열이 새로운 메모리에 할당되어 리턴됩니다.

시작 지점과 길이를 전달하면 인덱스의 시작부터 길이만큼의 문자열을 출력합니다.

실행 결과

3번째 인덱스의 값이 3(0부터 인덱스 시작)이고 3을 포함해서 5개의 부분 문자열을 출력합니다.

또한 다음과 같이 find()나 rfind()와 결합해서 파일의 이름과 확장자를 분리할 수 있습니다.

int main() { std::string path = "file.txt"; std::size_t pos = path.rfind('.'); std::string filename = path.substr(0, pos); std::string extension = path.substr(pos + 1); std::cout << "Filename: " << filename << std::endl; std::cout << "Extension: " << extension << std::endl; }

string의 rfind는 뒤에서부터 문자를 찾아서 위치를 리턴해주는 함수입니다.

여기서는 4를 리턴하며 시작부터 4개의 문자열을 substr()로 가져오면 파일 이름을 리턴합니다.

그리고 5번째 위치부터 전체를 가져오면 파일의 확장자를 리턴합니다.

실행 결과

이것은 예제이기 때문에 실제 파일에 적용하려면 확장자가 없는 파일 등에 대한 예외 처리가 필요합니다.

C++ string의 substr()을 통해 쉽게 부분 문자열 추출이 가능합니다.

문자 - 작은따옴표(' ')

문자열 - 쌍따옴표(" ")

charactor

문자 하나. 

ex)

char ch = 'A';

char ch[] = {'A', 'B', 'C'};

char[]

문자열.

char str[] = "Hello, world!"; // 자동으로 길이 할당  

 l

 l

 o

 ,

 w

 o

 r

 l

 d

 !

 \n

str[0] == 'H'

str[1] == 'e'

str[2] == 'l'

str[3] == 'l'
str[4] == 'o'
str[5] == ','
str[6] == ' '
str[7] == 'w'
str[8] == 'o'
str[9] == 'r'
str[10] == 'l'
str[11] == 'd'
str[12] == '!'
str[13] == '\n'

문자열의 들어가는 \n ( NULL 이나 '0' 으로도 표현 ) 은

문자열의 마지막을 나타내는 특수문자이다.

그래서 배열의 크기도 원래 글자 수보다 하나 많다.

char str[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n' };

 l

 l

 o

 ,

 w

 o

 r

 l

 d

 !

 \n

※ 참고로 이런 식으로 배열에 직접 문자를 넣어주는 선언을 할 때, \n가 char형 배열에 없다면

printf 등 문자열을 다루는 함수를 호출할 때 문자열이 아닌 문자로 받아들여 처참한 결과를 낳게 됨.

그런 경우, 그 배열은 이미 문자열이 아닌 단순한 '문자 배열' 이다.

char*

char* str = "Hello, World!";

배열에 한 글자 씩 할당되는 게 아니라, 메모리 공간에 문자열 자체 (Hello, World!\n) 를 저장한 후

해당 문자열의 첫 번째 문자의 주소를 반환하여 저장한다.

그래서인진 모르겠으나... 가리키는 주소는 얼마든지 변경할 수 있어도 문자열의 내용 자체는 변경할 수 없다.

CString

MFC에서 쓰이는 문자 표현 클래스. 더불어 내가 완전 사랑하는 놈

변환

※ 문자 집합

윈도우 프로그래밍에서는 문자집합 설정에 따라 문자의 표현 방법이 다르다.

비주얼 스튜디오의 프로젝트->(프로젝트명)속성의 구성속성->일반의 문자집합에서 설정할 수 있다.

설정을 안하는 경우는 안써봐서 잘 모르겠고.................

(자기가 원할 때 코드 안에서 문자 집합을 마음대로 변경할 수 있는지 없는지 알아봐야겠다.)

문자 집합은 멀티바이트유니코드로 나뉜다.

각각

"문자"(멀티바이트), L"문자"(유니코드)

와 같이 표현한다.

그리고 이러한 빡치는 문자 표현 방법으로 인해 뻘짓을 막기 위해 & 범용성(?)을 넓히기 위해

문자 집합을 유니코드로 설정했을 때 _UNICODE 가 선언되어 

예) _T(x) 매크로

#indef _UNICODE

 #define __T(x)  L##x

#else

 #define __T(x) x

#endif

이런식으로 매크로로 정의되어있고 설정따라 바뀌어가며 사용됩니다.

참고로 문자열 관련 변수, 예를 들어 LPCTSTR 는

유니코드일 땐 LPCWSTR, 멀티바이트일 때는 LPCTSTR 그대로 사용됩니다.... 아마 그럴겁니다-_-;;

저기서 W가 Wide char 라는 의미일거임.

아무튼 그런 의미로 MFC에서는 문자열을 _T("")로 표현하는 게 좋다.

문자->숫자

CString -> int

CString str = _T("34");

int i = _ttoi(str);

※ _ttoi(x)

string x를 int형으로 변경해줌.

( ANSI : atoi / UNICODE : _wtoi )

CString -> float

CString str = _T("23.583");

float f = _ttof(str);

※ _ttof(x)

string x를 float형으로 변경해줌

( ANSI : atof / UNICODE : _wtof )

숫자->문자

int -> CString

int i = 5;

CString str;

str.Format("%d", i);

int -> char* (+진법 변환)

char* _itoa(int value, char* str, int radix);

int value -> 변환을 하고자 하는 숫자

char* str -> 결과값 저장할 변수

int radix -> 진법 (2~36까지 된다고 하지만 2,8,10,16만 된다고도 하는데 확인은 안해봄)

문자->문자

CString -> LPWSTR

(unicode일 때.. 다른 건 안해봐서 잘 모르겠음)

LPWSTR pszText;

CString str = _T("test");

pszText = (LPWSTR)(LPCWSTR)str;

====== 나머지는 다음에

※ 유니코드 관련 함수 모음

퍼온건데 출처 명시가 안되어있음;;

1.      Formatted I/O

MACRO ANSI UNICODE
_tprintf printf wprintf
_ftprintf fprintf fwprintf
_stprintf sprint swprintf
_sntprintf _snprintf _snwprintf
_vtprintf vprintf vwprintf
_vftprintf vfprintf vfwprintf
_vstprintf vsprintf vswprintf
_vsntprintf _vsnprintf _vsnwprintf
_tscanf scanf wscanf
_ftscanf fscanf fwscanf
_stscanf sscanf swscanf
2.      Formatted I/O
MACRO ANSI UNICODE
_fgettc fgetc fgetwc
_fgetts fgets fgetwc
_fputtc fputc fputwc
_fputts fputs fputws
_gettc getc getwc
_gettchar getchar getwchar
_getts gets _getws
_puttc putc putwc
_puttchar putchar putwchar
_putts puts _putws
_ungettc ungetc ungetwc
3.       Stdio function
MACRO ANSI UNICODE
_tfopen _wfopen
_tfreopen _wfreopen
4.       String conversion function
MACRO ANSI UNICODE
_tcstod strtod wcstod
_tcstol strtol wcstol
_tcstoul strtoul wcstoul
_itot _itoa _itow
_ltot _ltoa _ltow
_ultot _ultoa _ultow
_ttoi atoi _wtoi
_ttol atol _wtol
5.       String function
MACRO ANSI UNICODE
_tcscat strcat wcscat
_tcschr strchr wcschr
_tcscmp strcmp wcscmp
_tcscpy strcpy wcscpy
_tcscspn strcspn wcscspn
_tcslen strlen wcslen
_tcsclen strlen wcslen
_tcsncat strncat wcsncat
_tcsnccat strncat wcsncat
_tcsnccmp strncmp wcsncmp
_tcsncmp strncmp wcsncmp
_tcsncpy strncpy wcsncpy
_tcsnccpy strncpy wcsncpy
_tcspbrk strpbrk wcspbrk
_tcsrchr strrchr wcsrchr
_tcsspn strspn wcsspn
_tcsstr strstr wcsstr
_tcstok strtok wcstok
_tcsdup _strdup _wcsdup
_tcsicmp _stricmp _wcsicmp
_tcsncicmp _strnicmp _wcsnicmp
_tcsnicmp _strnicmp _wcsnicmp
_tcsnset _strnset _wcsnset
_tcsncset _strnset _wcsnset
_tcsrev _strrev _wcsrev
_tcsset _strset _wcsset
_tcslwr _strlwr _wcslwr
_tcsupr _strupr _wcsupr
6.       ctype function
MACRO ANSI UNICODE
_istalpha isalpha iswalpha
_istupper isupper iswupper
_istlower islower iswlower
_istdigit isdigit iswdigit
_istxdigit isxdigit iswxdigit
_istspace isspace iswspace
_istpunct ispunct iswpunct
_istalnum isalnum iswalnum
_istprint isprint iswprint
_istgraph isgraph iswgraph
_istcntrl iscntrl iswcntrl
_istascii isascii iswascii
_totupper toupper towupper
_totlower tolower towlower

Toplist

최신 우편물

태그