- cstdlib / C++ 표준 라이브러리
- 1. malloc / free – 동적 메모리 할당 및 할당 해제에 사용됩니다
- 2. rand / srand – 난수를 생성하는 데 사용됩니다
- 3. exit – 프로그램 종료
- 4. atoi – 문자열을 정수로 변환하는 데 사용됩니다
- 5. atof – 문자열을 부동 소수점 번호로 변환하는 경우
- 6. strtol / strtoll – Long 및 Long Long Integer 로 변환
- strtoul / strtoull – 부호없는 Long 및 부호없는 Long Long Integer로 변환
- 7. system – 시스템 명령을 실행합니다
- 8. abort – 비정상적인 프로그램 종료를 강제합니다
- 9. qsort – 배열을 정렬합니다
cstdlib / C++ 표준 라이브러리
https://learn.microsoft.com/ko-kr/cpp/standard-library/cstdlib?view=msvc-170
cstdlib은 C++ 표준 라이브러리에 있는 라이브러리로
동적 메모리 관리, 난수 생성, 문자열을 숫자 값으로 변환하는 등의 일반적인 기능을 수행하기 위한 일련의 기능을 제공합니다.
라이브러리는 C++ 표준 라이브러리의 일부이며 cstdlib 헤더 파일에 정의되어 있습니다.
다양한 프로그래밍 컨텍스트에서 공통적이고 유용한 유틸리티 기능과 매크로 세트를 제공합니다.
cstdlib 라이브러리는 메모리 할당 및 프로세스 제어와 같은 낮은 수준의 작업을 수행하는 데 특히 유용합니다.

(cstdlib에서 가장 일반적으로 사용되는 함수)
malloc / free – 동적 메모리 할당 및 할당 해제에 사용됩니다
rand / srand – 난수를 생성하는 데 사용됩니다
exit – 프로그램 종료
atoi – 문자열을 정수로 변환하는 데 사용됩니다
atof – 문자열을 부동 소수점 번호로 변환하는 경우
strtol / strtoul – 문자열을 긴 또는 부호 없는 긴 정수로 변환하는 데 사용됩니다
system – 시스템 명령을 실행합니다
abort – 비정상적인 프로그램 종료를 강제합니다
qsort – 배열을 정렬합니다
예제
1. malloc / free – 동적 메모리 할당 및 할당 해제에 사용됩니다
#include <iostream>
#include <cstdlib>
int main() {
int n;
std::cout << "할당할 정수 수 입력 : ";
std::cin >> n;
// 동적으로 메모리를 할당할때 Heap(힙)영역에 할당
// 성공 : 할당한 메모리의 첫번째 주소 리턴
// 실패 : NULL 리턴
int* p = static_cast<int*>(malloc(n * sizeof(int))); // n개의 정수에 메모리 할당
if (p == nullptr) { // NULL이 return되면 => 할당 실패
std::cerr << "오류: 메모리를 할당할 수 없습니다 " << std::endl;
return 1;
}
for (int i = 0; i < n; i++) {
p[i] = i;
}
std::cout << "할당된 메모리에 다음 값이 포함되어 있습니다 : ";
for (int i = 0; i < n; i++) {
std::cout << p[i] << ' ';
}
std::cout << std::endl;
// 메모리 할당 해제
// 해제 안하면 메모리 릭, 메모리 누수가 발생
free(p);
return 0;
}

2. rand / srand – 난수를 생성하는 데 사용됩니다
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(nullptr)); // 현재 시간 seed로 난수 생성
//srand(time(NULL));
std::cout << rand() << std::endl;
std::cout << rand() << std::endl;
std::cout << rand() << std::endl;
std::cout << rand() << std::endl;
std::cout << rand() << std::endl;
for (int i = 0; i < 10; i++) {
int randomNumber = rand() % 100; // 0과 99 사이의 난수 생성
std::cout << randomNumber << std::endl;
}
return 0;
}

3. exit – 프로그램 종료
#include <iostream>
#include <cstdlib>
int main() {
std::cout << "Exiting program" << std::endl;
// 프로그램 종료
std::exit(0);
// 종료되어서 안나온다.
std::cout << "Do something!!";
return 0;
}

4. atoi – 문자열을 정수로 변환하는 데 사용됩니다
#include <iostream>
#include <cstdlib>
int main() {
std::string str;
std::cin >> str;
// 변환이 불가능 하다면 0 return
int num = std::atoi(str.c_str());
std::cout << num << std::endl;
return 0;
}

5. atof – 문자열을 부동 소수점 번호로 변환하는 경우
#include <iostream>
#include <cstdlib>
int main() {
std::string str;
std::cin >> str;
// atof() 함수는 입력 문자를 숫자로 해석하여 생성되는 double 값을 리턴합니다.
// 함수가 입력을 해당 유형의 값으로 변환할 수 없는 경우 리턴값은 0입니다.
// 오버플로의 경우, 함수는 errno를 ERANGE로 설정하고 값 -HUGE_VAL 또는 +HUGE_VAL을 리턴합니다.
// 변환이 불가능 하다면 0 return
float num = std::atof(str.c_str());
std::cout << num << std::endl;
return 0;
}

6. strtol / strtoll – Long 및 Long Long Integer 로 변환
strtoul / strtoull – 부호없는 Long 및 부호없는 Long Long Integer로 변환
모두 같은 방법으로 사용
#include <iostream>
#include <cstdlib>
#include <errno.h>
int main() {
//
// ststol, strtoul, strtof, strtoll 사용법이 같다.
//
// 이 예제에서는 strtoll 함수를 사용하여 문자열 "123456789"를 long long int로 변환합니다.
// 변환 결과는 num 변수에 저장된 다음 표준 출력으로 인쇄됩니다.
//
// strtoll 함수는
// 변환할 문자열, 문자열에 잘못된 첫 번째 문자의 주소를 저장할 문자에 대한 포인터,
// 숫자 표현의 기저(10진수의 경우 10진수)의 세 가지 인수를 사용합니다.
//
// 변환이 실패하면 endptr 변수가 첫 번째 잘못된 문자를 가리키고
// num 변수에 유효한 숫자 표현이 포함되지 않습니다.
// 변환이 성공했는지 확인하기 위해 *endptr이 문자열의 끝을 나타내는 '#include <iostream>
#include <cstdlib>
#include <errno.h>
int main() {
//
// ststol, strtoul, strtof, strtoll 사용법이 같다.
//
// 이 예제에서는 strtoll 함수를 사용하여 문자열 "123456789"를 long long int로 변환합니다.
// 변환 결과는 num 변수에 저장된 다음 표준 출력으로 인쇄됩니다.
//
// strtoll 함수는
// 변환할 문자열, 문자열에 잘못된 첫 번째 문자의 주소를 저장할 문자에 대한 포인터,
// 숫자 표현의 기저(10진수의 경우 10진수)의 세 가지 인수를 사용합니다.
//
// 변환이 실패하면 endptr 변수가 첫 번째 잘못된 문자를 가리키고
// num 변수에 유효한 숫자 표현이 포함되지 않습니다.
// 변환이 성공했는지 확인하기 위해 *endptr이 문자열의 끝을 나타내는 '\0'과 같은지 확인할 수 있습니다.
const char* str = "123456789";
char* endptr;
long long num = strtoll(str, &endptr, 10);
if (*endptr != '\0') {
std::cerr << "Conversion failed: non-digit characters present" << std::endl;
}
else {
std::cout << "The string " << str << " converted to a long long int is " << num << std::endl;
}
return 0;
}
'과 같은지 확인할 수 있습니다.
const char* str = "123456789";
char* endptr;
long long num = strtoll(str, &endptr, 10);
if (*endptr != '#include <iostream>
#include <cstdlib>
#include <errno.h>
int main() {
//
// ststol, strtoul, strtof, strtoll 사용법이 같다.
//
// 이 예제에서는 strtoll 함수를 사용하여 문자열 "123456789"를 long long int로 변환합니다.
// 변환 결과는 num 변수에 저장된 다음 표준 출력으로 인쇄됩니다.
//
// strtoll 함수는
// 변환할 문자열, 문자열에 잘못된 첫 번째 문자의 주소를 저장할 문자에 대한 포인터,
// 숫자 표현의 기저(10진수의 경우 10진수)의 세 가지 인수를 사용합니다.
//
// 변환이 실패하면 endptr 변수가 첫 번째 잘못된 문자를 가리키고
// num 변수에 유효한 숫자 표현이 포함되지 않습니다.
// 변환이 성공했는지 확인하기 위해 *endptr이 문자열의 끝을 나타내는 '\0'과 같은지 확인할 수 있습니다.
const char* str = "123456789";
char* endptr;
long long num = strtoll(str, &endptr, 10);
if (*endptr != '\0') {
std::cerr << "Conversion failed: non-digit characters present" << std::endl;
}
else {
std::cout << "The string " << str << " converted to a long long int is " << num << std::endl;
}
return 0;
}
') {
std::cerr << "Conversion failed: non-digit characters present" << std::endl;
}
else {
std::cout << "The string " << str << " converted to a long long int is " << num << std::endl;
}
return 0;
}
7. system – 시스템 명령을 실행합니다
#include <iostream>
#include <cstdlib>
int main() {
// 문자열 "Hello World"를 표준 출력으로 인쇄하는 명령인
// "echo Hello World" 인수로 호출
// 시스템 메서드는 실행된 명령의 상태 코드를 반환
// 0 성공
int result = system("echo Hello World");
std::cout << "The result of the system call is: " << result << std::endl << std::endl;
result = system("wrong Hello World");
// 1 실패
std::cout << "The result of the system call is: " << result << std::endl;
return 0;
}

8. abort – 비정상적인 프로그램 종료를 강제합니다
#include <iostream>
#include <cstdlib>
int main() {
// 비정상적인 프로그램 종료
std::cout << "Aborting program" << std::endl;
std::abort();
return 0;
}

9. qsort – 배열을 정렬합니다
#include <iostream>
#include <cstdlib>
// qsort 함수는 정수 배열을 정렬하는 데 사용됩니다.
// qsort 함수는 배열의 첫 번째 요소에 대한 포인터, 배열의 요소 수, 배열의 각 요소의 크기,
// 두 요소의 순서에 따라 0보다 작거나 같거나 큰 값을 반환하는 비교 함수의 네 가지 인수를 사용합니다.
// 비교 함수 비교는 배열의 요소에 대한 포인터인 두 개의 인수를 사용하고 두 포인터가 가리키는 값의 차이를 반환합니다.
// qsort 함수는 배열이 정렬될 때까지 순서가 잘못된 요소를 반복적으로 스왑하여 배열의 요소를 정렬합니다.
// 정렬 후 정렬된 배열이 표준 출력으로 인쇄됩니다
/*
compare 함수는 cstdlib 라이브러리의 qsort 함수가 요소 배열을 정렬하는 데 사용하는 비교 함수입니다.
compare 함수는 두 개의 인수를 사용하며, 각 인수는 배열의 요소에 대한 포인터입니다
*/
int compare(const void* a, const void* b) {
int numA = *(int*)a;
int numB = *(int*)b;
return (numA - numB);
}
/*
비교 함수는 두 정수를 비교합니다.
먼저 각 인수를 int에 대한 포인터에 캐스팅한 다음 포인터를 역참조하여 정수의 값을 얻습니다.
그런 다음 두 정수의 차이를 반환합니다.
비교 함수의 반환 값은 비교 중인 두 요소의 순서를 결정합니다.
반환 값이 0보다 작으면 첫 번째 요소는 두 번째 요소보다 작은 것으로 간주됩니다.
반환 값이 0이면 첫 번째 요소는 두 번째 요소와 동일한 것으로 간주됩니다.
반환 값이 0보다 크면 첫 번째 요소가 두 번째 요소보다 큰 것으로 간주됩니다.
qsort 함수는 비교 함수를 사용하여 배열이 정렬될 때까지
순서가 잘못된 요소를 반복적으로 스왑하여 배열의 요소를 정렬합니다.
*/
int main() {
int numbers[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
int size = sizeof(numbers) / sizeof(numbers[0]);
qsort(numbers, size, sizeof(int), compare);
std::cout << "Sorted array: ";
for (int i = 0; i < size; i++) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
return 0;
}


![백준 1981번 (배열에서 이동, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/boj-og.png)
![백준 1032번 (명령 프롬프트, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/boj-og-1.png)