Stdlib.h
1. 개요
`stdlib.h`는 C 표준 라이브러리의 헤더 파일로, 다양한 유틸리티 함수들을 정의한다. 이 헤더 파일은 문자열 변환, 의사 난수 생성, 동적 메모리 관리, 프로세스 제어, 검색 및 정렬, 정수 산술 등 다양한 기능을 제공한다. 주요 함수로는 문자열을 정수, long, double 형으로 변환하는 `atoi`, `atol`, `atof`, `strtol`, `strtoul`, `strtod` 등이 있으며, 의사 난수를 생성하는 `rand`와 `srand`, 동적 메모리를 할당하고 해제하는 `malloc`, `calloc`, `realloc`, `free` 등이 있다. 또한 프로세스 제어 함수인 `abort`, `atexit`, `exit`, `getenv`, `system`과 검색 및 정렬 함수 `bsearch`, `qsort` 등이 포함되어 있다. 마지막으로 정수의 절댓값을 구하는 `abs`, `labs` 와 정수 나눗셈을 수행하는 `div`, `ldiv` 함수를 제공한다.
| 헤더 파일 | stdlib.h |
|---|---|
| 표준 | C 표준 라이브러리 |
| 설명 | 일반적인 유틸리티 함수를 정의한다. 숫자 변환, 동적 메모리 할당, 난수 생성, 정렬, 검색에 관련된 함수를 포함한다. |
| EXIT_FAILURE | 실패 종료 코드 |
|---|---|
| EXIT_SUCCESS | 성공 종료 코드 |
| MB_CUR_MAX | 현재 로캘의 멀티바이트 문자에서 최대 바이트 수 |
| NULL | 널 포인터 상수 |
| RAND_MAX | rand 함수에 의해 반환되는 최대값 |
| div_t | div 함수에 의해 반환되는 구조체 |
|---|---|
| ldiv_t | ldiv 함수에 의해 반환되는 구조체 |
| lldiv_t | lldiv 함수에 의해 반환되는 구조체 |
| size_t | sizeof 연산자의 결과 자료형 |
| wchar_t | 와이드 문자 자료형 |
| 수치 변환 | atof: 문자열을 double형으로 변환 atoi: 문자열을 int형으로 변환 atol: 문자열을 long형으로 변환 atoll: 문자열을 long long형으로 변환 strtod: 문자열을 double형으로 변환 strtof: 문자열을 float형으로 변환 strtold: 문자열을 long double형으로 변환 strtol: 문자열을 long형으로 변환 strtoll: 문자열을 long long형으로 변환 strtoul: 문자열을 unsigned long형으로 변환 strtoull: 문자열을 unsigned long long형으로 변환 |
|---|---|
| 난수 생성 | rand: 난수 생성 srand: 난수 생성기 시드 설정 |
| 메모리 관리 | calloc: 메모리 할당 및 초기화 free: 메모리 해제 malloc: 메모리 할당 realloc: 메모리 재할당 |
| 환경 | abort: 비정상적인 프로그램 종료 atexit: 프로그램 종료 시 호출될 함수 등록 exit: 프로그램 종료 getenv: 환경 변수 값 가져오기 system: 시스템 명령 실행 |
| 검색 및 정렬 | bsearch: 이진 검색 qsort: 배열 정렬 |
| 정수 연산 | abs: 정수의 절대값 div: 정수 나눗셈 labs: long형 정수의 절대값 ldiv: long형 정수 나눗셈 llabs: long long형 정수의 절대값 lldiv: long long형 정수 나눗셈 |
| 멀티바이트 문자 | mblen: 멀티바이트 문자 길이 얻기 mbtowc: 멀티바이트 문자를 와이드 문자로 변환 wctomb: 와이드 문자를 멀티바이트 문자로 변환 mbstowcs: 멀티바이트 문자열을 와이드 문자열로 변환 wcstombs: 와이드 문자열을 멀티바이트 문자열로 변환 |
-
C 표준 라이브러리 헤더 -
Errno.h
errno.h는 POSIX 표준 오류 값과 추가 매크로를 정의하며, GNU C 라이브러리는 strerror 함수를 통해 각 오류에 대한 설명을 제공한다. -
C 표준 라이브러리 헤더 -
Stdio.h
`stdio.h`는 C 프로그래밍 언어의 표준 입출력 라이브러리 헤더 파일로, 파일 조작 및 콘솔 입출력 함수, `EOF`, `NULL` 등의 상수, `stdin`, `stdout`, `stderr` 같은 표준 스트림 변수, 그리고 `FILE` 형식을 제공하며, `gets()` 함수와 같은 보안 취약점에 대한 주의가 필요하다.
2. 문자열 변환
`stdlib.h`에는 문자열을 다른 데이터 타입으로 변환하는 여러 함수들이 포함되어 있다. 이 함수들을 이용하면 문자열 형식의 숫자를 정수나 실수로 쉽게 바꿀 수 있다.
| 함수 | 설명 |
|---|---|
| `int atoi ( const char * str );` | 문자열 `str`을 `int` 형으로 변환한다. |
| `long int atol ( const char * str );` | 문자열 `str`을 `long` 형으로 변환한다. |
| `double atof ( const char * str );` | 문자열 `str`을 `double` 형으로 변환한다. |
| `long int strtol ( const char * str, char endptr, int base );` | 문자열 `str`을 `base` 진법으로 해석하여 `long int` 형으로 변환한다. `endptr`이 `NULL`이 아니면, 변환 후 남은 첫 번째 문자 위치를 `endptr`에 저장한다. |
| `unsigned long int strtoul ( const char * str, char endptr, int base );` | 문자열 `str`을 `base` 진법으로 해석하여 `unsigned long int` 형으로 변환한다. `endptr`이 `NULL`이 아니면, 변환 후 남은 첫 번째 문자 위치를 `endptr`에 저장한다. |
| `double strtod ( const char * str, char ** endptr );` | 문자열 `str`을 `double` 형으로 변환한다. `endptr`이 `NULL`이 아니면, 변환 후 남은 첫 번째 문자 위치를 `endptr`에 저장한다. |
`atoi`, `atol`, `atof`는 각각 문자열을 정수, 긴 정수, 실수로 변환하는 간단한 함수들이다.
`strtol`, `strtoul`, `strtod`는 더 정교한 변환을 제공한다. 이 함수들은 지정된 진법(`base`)에 따라 문자열을 해석하고, 변환 과정에서 숫자가 아닌 문자를 만났을 때 그 위치를 `endptr`로 알려준다.
2.1. `atoi`, `atol`, `atof`
wikitext
| 함수 | 설명 |
|---|---|
| `int atoi ( const char * str );` | 문자열 `str`을 `int` 형으로 변환한다. |
| `long int atol ( const char * str );` | 문자열 `str`을 `long` 형으로 변환한다. |
| `double atof ( const char * str );` | 문자열 `str`을 `double` 형으로 변환한다. |
2.2. `strtol`, `strtoul`, `strtod`
`strtol` 함수는 문자열 `str`을 `base` 진법으로 해석하여 `long int` 형으로 변환한다. `endptr`이 `NULL`이 아니면, 변환 후 남은 첫 번째 문자 위치를 `endptr`에 저장한다.
`strtoul` 함수는 문자열 `str`을 `base` 진법으로 해석하여 `unsigned long int` 형으로 변환한다. `endptr`이 `NULL`이 아니면, 변환 후 남은 첫 번째 문자 위치를 `endptr`에 저장한다.
`strtod` 함수는 문자열 `str`을 `double` 형으로 변환한다. `endptr`이 `NULL`이 아니면, 변환 후 남은 첫 번째 문자 위치를 `endptr`에 저장한다.
3. 의사 난수 생성
`함수 설명 int rand ( void ); 0부터 `RAND_MAX` 사이의 의사 난수를 반환한다. 더 자세한 내용은 `rand` 섹션 참고 void srand ( unsigned int seed ); 의사 난수 발생기를 `seed` 값으로 초기화한다. 보통 `time(NULL)`을 사용해 초기화한다. 더 자세한 내용은 `srand` 섹션 참고
3.1. `rand`
0부터 `RAND_MAX` 사이의 의사 난수를 반환한다.
3.2. `srand`
의사 난수 발생기를 초기화한다. 일반적으로 `time(NULL)`을 사용하여 초기화한다.
```c
void srand ( unsigned int seed );
```
`srand` 함수는 `seed` 값을 기반으로 의사 난수 발생기를 초기화한다. 보통 `seed`는 `time(NULL)`로 설정된다. `time(NULL)`은 현재 시간을 나타내는 정수 값을 반환하므로, 프로그램을 실행할 때마다 다른 `seed` 값을 가지게 되어 매번 다른 난수열을 생성할 수 있게 된다. `rand` 함수를 사용하여 난수를 생성하기 전에 `srand` 함수를 호출하여 난수 발생기를 초기화하는 것이 일반적이다.
4. 동적 메모리 관리
`malloc`, `calloc`, `realloc` 함수는 힙(heap)에서 메모리를 할당하고, `free` 함수는 할당된 메모리를 해제한다. 각 함수에 대한 더 자세한 내용은 하위 문서를 참고하라.
| 함수 | 설명 |
|---|---|
| void * malloc ( size_t size ); | size 바이트의 메모리를 힙에서 할당하여 반환한다. |
| void * calloc ( size_t num, size_t size ); | (num * size) 바이트의 메모리를 힙에서 할당하여 반환한다. |
| void * realloc ( void * ptr, size_t size ); | ptr이 가리키는 메모리를 size 바이트만큼 힙에서 재할당하여 반환한다. |
| void free ( void * ptr ); | ptr이 가리키는 메모리를 해제한다. (할당했으면 반드시 해제해야 한다.) |
4.1. `malloc`, `calloc`, `realloc`
`malloc` 함수는 size 바이트의 메모리를 힙에서 할당하여 반환한다. `calloc` 함수는 (num * size) 바이트의 메모리를 힙에서 할당하여 반환한다. `realloc` 함수는 ptr이 가리키는 메모리를 size 바이트만큼 힙에서 재할당하여 반환한다.
4.2. `free`
`free` 함수는 `ptr`이 가리키는 메모리를 해제한다. 이 메모리는 `malloc`, `calloc`, `realloc` 함수로 힙에서 동적으로 할당된 것이어야 한다. 할당된 메모리는 사용 후 반드시 `free` 함수로 해제해야 한다.
```
| 함수 | 설명 |
|---|---|
| void free ( void * ptr ); | ptr이 가리키는 메모리를 해제한다.(할당했으면 반드시 해제해야 한다.) |
5. 프로세스 제어
`stdlib.h`에 정의된 프로세스 제어 함수들은 프로그램의 실행 흐름을 제어하는 데 사용된다. 각 함수들은 특정한 상황에서 프로세스를 종료하거나, 종료 시 특정 동작을 수행하도록 설정하거나, 외부 명령을 실행하는 등의 기능을 제공한다.
| 함수 | 설명 |
|---|---|
| `void` abort `( void );` | 현재 프로세스를 비정상적으로 종료한다. |
| `int` atexit `( void ( * function ) (void) );` | 프로세스가 정상적으로 종료될 때 실행할 함수를 지정한다. |
| `void` exit `( int status );` | 현재 프로세스를 정상적으로 종료한다. `status`는 부모 프로세스에게 전달된다. |
| `char *` getenv `( const char * name );` | `name`에 해당하는 환경 변수를 반환한다. |
| `int` system `( const char * command );` | `command`에 해당하는 시스템 명령을 실행한다. |
5.2. `atexit`
`atexit` 함수는 프로세스가 정상적으로 종료될 때 실행할 함수를 등록한다. 함수 원형은 다음과 같다.
```c
int atexit ( void ( * function ) (void) );
```
`function`은 종료 시 호출될 함수를 가리키는 포인터이다.
5.4. `getenv`
cpp
char * getenv ( const char * name );
```
`name`에 해당하는 환경 변수를 반환한다.
getenv영어 함수는 C 표준 라이브러리 함수 중 하나로, 지정된 환경 변수의 값을 가져오는 데 사용된다. 이 함수는 `stdlib.h` 헤더 파일에 정의되어 있다.
함수의 원형은 다음과 같다.
```cpp
char * getenv ( const char * name );
```
* `name`: 값을 가져올 환경 변수의 이름을 나타내는 문자열이다.
`getenv` 함수는 지정된 환경 변수가 존재하면 해당 값을 가리키는 문자열 포인터를 반환한다. 만약 지정된 환경 변수가 존재하지 않으면, 널 포인터(NULL)를 반환한다. 반환된 문자열은 정적 메모리 영역에 저장되므로, 복사해서 사용해야 한다.
예를 들어, "PATH" 환경 변수의 값을 가져오려면 다음과 같이 코드를 작성할 수 있다.
```cpp
#include
#include
int main() {
char *path = getenv("PATH"); // PATH 환경 변수의 값을 가져온다.
if (path != NULL) { // 환경 변수가 존재하는 경우
printf("PATH: %s\n", path); // PATH 환경 변수의 값을 출력
} else { // 환경 변수가 존재하지 않는 경우
printf("PATH 환경 변수가 설정되지 않았습니다.\n");
}
return 0;
}
```
이 코드는 "PATH" 환경 변수의 값을 가져와서, 존재하면 그 값을 출력하고, 존재하지 않으면 "PATH 환경 변수가 설정되지 않았습니다."를 출력한다.
6. 검색/정렬
`stdlib.h`에는 배열에서 특정 값을 검색하거나 정렬하는 데 사용되는 함수들이 있다.
* `bsearch`: 이진 검색을 수행한다.
* `qsort`: 퀵 정렬 알고리즘을 사용하여 정렬한다.
6.1. `bsearch`
이진 검색을 수행한다.
6.2. `qsort`
퀵 정렬 알고리즘을 사용하여 정렬한다.
```cpp
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
7. 정수 산술
`abs`, `labs` 함수는 정수의 절댓값을 계산하고, `div`, `ldiv` 함수는 정수 나눗셈의 몫과 나머지를 계산하는 데 사용된다. 이 함수들은 `
`div`와 `ldiv`는 몫과 나머지를 계산하여 `div_t` 또는 `ldiv_t` 구조체에 저장하여 반환한다. `div_t` 구조체는 `quot` (몫)와 `rem` (나머지) 멤버를 가진다.
7.1. `abs`, `labs`
`abs`와 `labs`는 정수의 절댓값을 반환하는 함수이다.
| 함수 | 설명 |
|---|---|
| int abs ( int n ); long int labs ( long int n ); | n의 절댓값을 반환한다. |
7.2. `div`, `ldiv`
`div`와 `ldiv`는 정수 나눗셈의 몫과 나머지를 반환하는 함수이다. `div`는 `int`형, `ldiv`는 `long`형 정수에 대해 나눗셈을 수행한다. 함수의 결과는 `div_t` (또는 `ldiv_t`) 구조체에 저장되며, 이 구조체의 `quot` 멤버는 몫, `rem` 멤버는 나머지를 나타낸다.
```cpp
div_t div (int numerator, int denominator);
ldiv_t ldiv (long numerator, long denominator);
```
예를 들어 `div(10, 3)`을 호출하면, `quot` 값은 3, `rem` 값은 1인 `div_t` 구조체가 반환된다.