MFC 문자열 총정리
Programming/MFC 2012. 6. 15. 19:58 |문자 - 작은따옴표(' ')
문자열 - 쌍따옴표(" ")
charactor
문자 하나.
ex)
char ch = 'A';
A |
char ch[] = {'A', 'B', 'C'};
A |
B |
C |
char[]
문자열.
char str[] = "Hello, world!"; // 자동으로 길이 할당
H |
e |
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' };
H | e | 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 |
[출처] 유니코드 관련 함수들|작성자 백이
'Programming > MFC' 카테고리의 다른 글
::SetCurrentDirectory를 사용하면 다른 API 함수에 영향을 끼칠지도 모른다. (0) | 2012.08.07 |
---|---|
[MFC 종료]OnCancel(), OnClose(), OnDestroy(), OnOK() 그리고 Dialog 소멸자 (0) | 2012.06.27 |
CString를 char*로 바꾸기 (0) | 2012.04.25 |
자식윈도우 Z-order 문제 (2) | 2012.03.30 |
VISUAL C++ 2008 MFC 윈도우 프로그래밍 247p 3번 (0) | 2012.02.16 |