cstdlib / C++ 표준 라이브러리 사용법 정리


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이 문자열의 끝을 나타내는 '\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;

}

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;
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤