C, C++ 문법 28

텍스트 간결하게 편집 중복공백 중복개행 주석 제거

// 텍스트에서 중복 공백이나 중복 개행 제거, 주석을 포함시키지 않고 순수 내용만 간결하게 남긴다. // 길이가 줄어드므로 소스와 버프에 동일 주소를 지정해도 된다. TCHAR * __stdcall ConsciseText(TCHAR *buf, const TCHAR *src) { TCHAR *p, *q; p = (TCHAR *)src;// 소스 포인터 q = buf;// 버프 포인터 for (; ; ) { if (!*p)// 문자열 맨 끝 널문자인 경우 { if (q != buf)// ★ 논리상 버퍼 기록 여부를 먼저 판단해야 q[-1] 조건이 유효하다. 더 아래에서도 마찬가지로 조건문에서 가장 앞에 두어야 한다. { if (q[-1] == ' ')// 문자열-공백-널문자순인 경우 공백은 무의미하므로 1..

C, C++ 문법 2022.08.27

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

c의 qsort와 stl의 sort에서 비교 함수(또는 함수객체) 사용시 결과값 세팅 주의

오름차순 정렬하면 앞에는 작은 것, 뒤에는 큰 게 온다. 갈수록 오른다고 생각하면 된다. ex) 0, 1, 7, 31, 55, 77, 999 김연아, 네이버, 다음, 라이코스, 마라도나, 메시, 박지성, 사오정, 애플, 잡스, 차범근, 카카, 태연, 펠레, 호날두, 홍명보 1. c qsort에서 비교함수 사용시 오름차순 정렬 int Compare(const void *a, const void *b) { return _tcsicmp(((PERSON *)a)->szName, ((PERSON *)b)->szName); } qsort(pPerson, count, sizeof(PERSON), Compare); 참고로 포인터의 연산자 순위가 형변환보다 높다. 위에서 형변환 먼저 처리하려면 필히 괄호를 써줘야 된다...

C, C++ 문법 2012.10.22

가변인수 활용하기

가변인수는 ...으로 표시하고 이를 받기 위해서는 따로 매크로 va_ 로 시작되는 매크로들을 사용해야 한다. 이를 이용하면 따로 입맛에 맛는 함수를 만들 수 있다. 가령 에디트 콘트롤에 문자열을 입력하고자 할때 보통 char szText[256]; wsprintfA(szText, "%d, %s\r\n", 정수, 문자열); SetWindowTextA(hEdit, szText); 이렇게 3줄이나 걸리는데,,,, 가변 인수를 직접 사용자 정의 함수에서 조작하면 PrintOnEdit(HWND hWnd, char *lpFmt, ...) 식으로 한 줄로 깔끔하게 처리할 수 있게 된다. 활용도가 좋다. 아래는 로그 에디트에 출력하는 예. int LogText(LPCSTR lpFmt, ...) // stdcall로 선..

C, C++ 문법 2012.03.06

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

#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

헥스 문자열과 값의 상호 변환

/** @author nameless @brief 값을 헥스 문자열로 변환한다. 1바이트당 문자 2개로 표현한다. 예를 들어 0의 경우에 "0"이 아닌 "00"으로 변환한다. */ unsigned int __stdcall ValToHexStrA(char *pszDestStr, const void *pSrcVal, unsigned int cbSize) { unsigned int len; len = cbSize > 4; // 상위 4비트(128 이상인 값의 연산 대비 unsigned 형으로 캐스팅) if (*pszDestStr >= 0 && *pszDestStr = 0 && *pszDestStr = '0' && *pszHexStr

C, C++ 문법 2011.07.25

비트 연산으로 산술연산 빠르게 처리하기

> n 은 2를 n번 나눈 것이고 위의 것들은 익히 잘 알려져 있고 꽤 쓰이는 듯 하다. 다음으로 2의 n제곱 단위의 수를 나눈 나머지 연산의 경우도 앤드 연산으로 가능하다. i % 2 => i & 1 i % 4 => i & 3 i % 8 => i & 7 i % 16 => i & 15 i % 32 => i & 31 .... i % 2의 n제곱 => i & (2의 n제곱 - 1) 나머지 연산보다는 비트 연산이 비할바 없이 빠르다. 참고로 릴리즈 실행 화일을 올리디버거 사용하여 어셈블리 코드를 뜯어보니 역시나 컴파일러가 저 경우 앤드 연산으로 알아서 최적화 코드를 생성함을 알 수 있었다. 다음으로 xor 연산으로 특정한 경우 뺄셈처리가 가능하다. 가령 32개의 요소가 있는 경우 0 ~ 31까지 인덱스를 역순..

C, C++ 문법 2011.07.24