본문 바로가기

C & C++30

[C++] 입력 버퍼가 비어있는지 확인하고 문자가 남아 있다면 제거하는 방법 코딩을 하다 보면 사용자로부터 입력을 받을 때 입력 버퍼에 문자가 남아있어서 입력이 무시되거나 코드가 원하는 흐름대로 흘러가지 않는 경우가 있습니다. 입력 버퍼에 문자가 남아있다고 확신한다면 다음과 같은 방법을 사용할 수 있습니다.cin.ignore(numeric_limits::max(), '\n');  이 방법은 개행문자가 나올 때까지 버퍼에 있는 입력을 무시하지만 버퍼가 이미 비어있었다면 사용자로부터 받아야 할 입력을 무시해 버리게 됩니다. 그래서 다음과 같이 버퍼에 문자가 남아있는 수만큼 무시하는 방법이 있습니다.cin.ignore(cin.rdbuf()->in_avail()); in_avail()은 버퍼에 남아있는 문자의 수를 반환하는데 문자가 남아있지 않다면 0개의 문자를 무시하므로 이어지는 입력.. 2024. 9. 23.
[C++] C++ 20 Ch 10. C++ 20Modules// module은 include 의 많은 단점들을 보완함// - 매번 헤더를 소스 파일에 복사/붙여넣기 하는 것// - pragam, ifndef 등을 사용하지 않게 됨// - 헤더 내부에서 의도하지 않은 것들에 대한 공개사용자 정의 모듈export module moduleName;export void swap(int& a, int& b){}main.cppimport moduleName;int num0 = 10, num1 = 20;swap(num0, num1);Concepts템플릿 파라미터에 제약을 거는 것templateconcept NonPointer = !std::is_pointer::value; // concept 을 이용하면 template 에 대한 제약을 .. 2024. 8. 26.
[C++] Modern C++ Ch 09. Modern C++auto이전에는 자동지역변수로 할당하는 용도였지만 C++ 11부터는 타입 추론의 역할을 한다. auto i = 10; // intauto j = 10u // unsigned intauto를 사용하면 가독성을 높이고 실수를 줄일 수 있다.std::vector v;std::vector::iterator iter0 = v.begin();auto iter1 = v.begin(); // 이 경우는 가독성에서 유리하다. 위의 경우 타입이 너무 장황함Person* person0 = new Person;auto person1 = new Person; // 좌변의 Person을 생략하여 중복되지 않는다.std::map m;for (const std::pair& pair : m) {} //.. 2024. 8. 26.
[C++] STL Ch 08. STLSTL의 개요Standard Template Library의 약자로 컨테이너, 이터레이터, 알고리즘으로 구분할 수 있다.Sequence Containers 에는 vector, deque, list, forward_list, array 가 있다. 사용자가 값을 넣는 순서에 영향을 받는다.std::vector vector;vector.push_back(10);vector.push_back(20);vector.push_back(-1);// 넣어주는 순서대로 출력, Sequence Containercout Odered Associative Containers 에는 set, multiset, map, multimap 이 있다. 사용자가 값을 넣는 순서에 상관없이 정렬된 형태로 나온다.std::s.. 2024. 8. 20.
[C++] 템플릿, 타입 Ch 06. 템플릿함수 템플릿void swap(int& x, int& y){ int temp = x; x = y; y = temp;}위 함수는 간단한 swap 함수이다. 하지만 int로 정의되어 있어 다른 자료형의 데이터는 받을 수 없다. 다른 자료형을 받으려면 오버로딩 해야 하는데 매우 번거롭다. 이를 해결하기 위한 툴이 함수 템플릿이다.templatevoid swap(T& x, T& y){ int temp = x; x = y; y = temp;}int main(){ int x = 10, y = 20; swap(x, y); // 타입 명시 swap(x, y); // 타입 추론위 코드는 함수가 아니라 함수 템플릿이다. 함수를 호출하는 순간에 템플릿을 기반으로 함수가 만들어.. 2024. 8. 16.
[C++] 예외 처리 Ch 05. 예외 처리전통적인 예외 처리예외가 발생했을 때 사용할 수 있는 방법은 여러 가지가 있다.// 프로그램을 종료하는 방법std::abort(); // 비 정상 종료exit(123); // 코드와 함께 종료return 123; // 코드와 함께 종료// 반환하여 오류를 알려주는 방법printf(); // 에러가 나면 -1 반환, 정상이면 글자 수 반환std::cout이외에도 전역변수로 errorCode 확인하기 등 방법이 있지만 예외처리가 강제되지 않기 때문에 예외가 무시될 수 있다. 예외처리를 강제라기 위한 메커니즘으로 C++에서 try catch를 사용한다.#include using std::cout;using std::endl;int divide(double d, double v, doubl.. 2024. 8. 8.