문자열 5

sprintf(swprintf, _stprintf) 함수에서 실수 문자열 표현시 주의

sprintf(swprintf, _stprintf) 함수에서 실수 문자열 표현시 소수점 첫째자리까지 표현하게 설정한 경우 자체적으로 소수점 둘째자리에서 반올림처리해서 표시해버린다. double num = 99.99; TCHAR szText[256]; _stprintf(szText, _T("%.01f"), num)인 경우 문자열은 "100.0"이 된다. 프로그래머가 반올림을 의도하지 않고 이하 자리는 버림을 원하는 경우 이러한 표현은 난감할 것이다. 이경우 floor 함수를 사용하거나, 숫자의 범위가 정수로 커버가능한 경우 간단히 형 변환식으로 처리할 수 있다. floor 함수 사용: _stprintf(szText, _T("%.01f"), floor(10. * num) / 10.); 형변환 처리: _stp..

C, C++ 문법 2012.10.24

대소문자 구별 없이 소스 문자열에서 특정 문자열 찾기

#if defined(UNICODE) || defined(_UNICODE) #define_tcsistr wcsistr #else #define_tcsistr stristr #endif char * __stdcall stristr(const char *src, const char *fnd) { const char *p, *q; char a, b; for (; ; ++src) { for (p = src, q = fnd; *q; ++p, ++q)// 빠른 실행 위해 *p 조건은 넣지 않는다. 안의 문자 불일치 조건으로 처리된다. { if (*p = 'A') {a = *p + 0x20;} else {a = *p;}// 'A' 이상인 경우가 훨씬 많으므로 'Z' 이하 조건을 앞에 두는게 효율적이다. if (*q ..

C, C++ 문법 2012.03.05

문자열 입력시 헥스 문자열을 통해 헥스 값을 그대로 입력시키고자 할 때 알아두면 좋은 tip!

우연히 웹에서 검색하다 소스에서 발견한 건데,,, \x를 붙이면 뒤의 헥스 형식의 문자 둘은 그대로 헥스값으로 입력된다. x는 반드시 소문자여야만 하는 것 같다. 가령 아래와 같은 경우는 모두 김치가 들어간다. //char szText[] = "김치"; //char szText[] = {0XB1, 0XE8, 0XC4, 0XA1, 0}; // 이 경우 메모리의 리소스 섹션에 스트링은 존재하지 않을 것이다. char szText[] = "\xB1\xE8\xC4\xA1\x00";

C, C++ 문법 2012.03.01

멀티바이트 및 유니코드 문자열 길이 구하는 api 사용시 유의점

멀티바이트는 말그대로 문자 하나의 길이를 다양하게(멀티하게^^) 처리한다는 의미이다. 멀티바이트는 숫자나 영문자나 인용부호 등을 1바이트로 처리하며, 그외 한글이나 중국 글자, 일본글자 등은 2바이트로 표현한다. 1바이트와 2바이트 값을 구분하기 위해 2바이트는 무조건 128(0x80)이후의 값으로 시작할 것이다. 가령 영문 'z'는 0x7a, 한글 '가'는 0xb0,0xa1 값으로 표현된다. 시스템이 문자를 맞딱뜨렸을때 0x80보다 적은 값이면 해당 문자를 z처럼 1바이트로 인식하고 0x80이 넘으면 2바이트 값이므로 다음의 1바이트와 같이 읽어서 의미를 파악할 것이다. 유니코드는 각각의 문자에 유니크한 값을 주어서 모든 문자는 동일한 길이를 지닌다. 현재는 2바이트이다. 세계의 모든 문자를 유니코드로..

API 2009.06.24