
C/C++에서 가끔씩 사용하지만 다른 언어에서 지원하는 것으로 착각하고 혼란스러워하는 것이 단순한 대소문자 바꾸기이다. int rlupper(char *str) { if(str == NULL) return -1; while(*str != '\0') { *str = toupper(*str); str++; } return 0; } int rllower(char *str) { if(str == NULL) return -1; while(*str != '\0') { *str = tolower(*str); str++; } return 0; } 전형적인 사용법은 위의 예제 코드처럼 toupper(), tolower() 함수를 사용해서 대문자나 소문자 변환을 하는 방법이다. 문제는 이들 함수는 문자 하나씩을 받아 변환..

C언어와 같은 전통적인 프로그래밍 언어에서는 함수에서 값을 리턴한다고 생각하면 정수나 구조체의 포인터와 같은 단일값을 생각하지만 파이썬이나 자바스크립트와 같은 요즘 많이 쓰는 언어에서는 서로 다른 타입의 값 두 개 뿐만 아니라 리스트를 넘길 수도 있다. C++에서는 리스트나 사전 타입이 아니라 단순히 두 개의 요소로 이루어진 객체를 위해서 std::pair라는 템플릿을 제공한다. std::pair parse_row(xml::parser *parser, xlnt::detail::number_serialiser &converter, std::vector &parsed_cells) { std::pair props; for (auto &attr : parser->attribute_map()) { if (stri..

스트링 클래스는 C++ 프로그램을 작성하면서 가장 빈번하게 사용하는 클래스 중의 하나이다. 기존의 char, char *, char []를 사용하는 문자열 표현도 사용할 수 있지만 string 클래스를 활용하면 좀 더 편리하고 안전한 작업을 할 수 있다. std::string 타입은 char을, 각 원소로 std::wstring 타입은 wchar_t 타입을 원소로 한다. 다른 형태의 스트링 타입도 있는 데 사용하려면 기준 C++ 컴파일러 버전을 확인해야 한다. string strParse( const string &path, int level, const string &sep, int *off) { int an_dir = off ? *off : 0; int t_lev = 0; size_t t_dir; i..

파이썬, PHP, 자바스크립트, 심지어 C#까지 개발자들이 즐겨 사용하는 프로그래밍 언어에서는 대부분 사전 타입을 지원한다. 그만큼 아주 편리하게 프로그램을 작성할 수 있기 때문이다. std::map 또한 C++에서 간편하게 사전 타입을 활용할 수 있도록 지원하는 컨테이너 클래스이다. "키-값" 쌍으로 관리하는 정렬된 리스트로 키는 리스트 내에서 유일한 값이어야 한다. "[키]"형식으로 키에 해당하는 값에 접근할 수 있다. 값에 단일 값이 아닌 여러 요소를 가지게 하고 싶다면 값에 또 다른 map이나 벡터, 클래스, 배열 등을 갖도록 하면 된다. map은 반드시 "키-값" 쌍으로 관리하는 원칙을 지켜야 한다. 정렬되지 않은 리스트로 관리하려면 unordered_map을 사용한다. map itsMap; i..

벡터 클래스는 모든 원소들이 동일한 타입을 갖는 배열과 유사하지만 그 크기를 동적으로 관리할 수 있다는 점에서 차이가 있다. 배열처럼 인덱스를 통해 각 원소에 접근할 수 있다. 배열보다 공간을 더 차지하고 추가적인 처리 비용이 더 필요하다는 특성이 있다. 향후 확장을 위해서 미리 여분의 공간을 확보하고, 확보한 공간을 넘어서서 확장하는 경우 공간 재할당을 수행하기 때문이다. std::vector split_path(const std::string &path, char delim) { std::vector split; std::string::size_type previous_index = 0; auto separator_index = path.find(delim); while (separator_index..
☞ fork, getpid, getppid, waitpid, wait, setsid, getsid, getpgrp, getpgid, setpgid, setpgrp pid_t fork(void); pid_t getpid(void); pid_t getppid(void); pid_t waitpid(pid_t pid, int *status, int options); pid_t wait(int *status); pid_t setsid(void); pid_t getsid(pid_t pid); pid_t getpgrp(void); int getpgid(pid_t pid); int setpgid(pid_t pid, pid_t pgid); 각 프로세스는 pid_t 타입의 고유한 프로세스 아이디(PID)를 갖습니다. ge..
☞ system, execv, execl, execve, execle, execvp, execlp int system(const char *command); int execv(const char *filename, char *const argv[]); int execl(const char *filename, const char *arg0, ...); int execve(const char *filename, char *const argv[], char *const env[]); int execle(const char *filename, const char *arg0, ..., char *const env[]); int execvp(const char *filename, char *const argv[])..
☞ exit, atexit, abort void exit(int status); int atexit(void(*function_name)(void)); void abort(void); C 프로그램에서 프로그램을 종료하는 가장 일반적인 방법은 main() 함수를 빠져 나오는 것입니다. 많은 경우 별 신경을 쓰지 않지만 main() 함수의 리턴 타입은 정수형(int)으로 값을 리턴하면 프로그램을 실행시킨 쉘이나 부 프로세스에서 그 값을 확인할 수 있습니다. ☞ 예제1 void boot_server_status(BOOT_SERVER_STATUS status) { static const char * status_str[] = { "UNKNOWN", "UP", "DOWN", "MAINTENANCE" }; if (..