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")));

출력화면

Mfc 문자열 몇 글자 비교

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;
}

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

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

Mfc 문자열 몇 글자 비교
실행 결과

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번째 위치부터 전체를 가져오면 파일의 확장자를 리턴합니다.

Mfc 문자열 몇 글자 비교
실행 결과

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

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