[C++] printf(), scanf()로 cin, cout 구현
2024. 4. 2. 14:26ㆍProgramming Language/C++
#include <iostream>
#include <cstdio> // printf(), scanf_s()
#include <clocale> // setlocale(), _wsetlocale()
// 사용자 정의 입출력 스트림 클래스
// cin, cout을 하나의 클래스에 구현했다.
class CMyIOStream {
public:
//--------- cout 구현 ---------//
// 연산자 오버로딩: 정수 출력
CMyIOStream& operator<<(int _idata) {
printf("%d", _idata); // 정수 출력
return *this; // 객체 자기 자신 반환
}
// 연산자 오버로딩: 문자열 출력 (1byte 문자열)
CMyIOStream& operator<<(const char* _pString) {
printf("%s", _pString); // 문자열 출력
return *this; // 객체 자기 자신 반환
}
// 연산자 오버로딩: 문자열 출력 (2byte 유니코드 문자열)
CMyIOStream& operator<<(const wchar_t* _pString) {
wprintf(L"%s", _pString); // 유니코드 문자열 출력
return *this; // 객체 자기 자신 반환
}
//--------- cin 구현 ---------//
// 연산자 오버로딩: 정수 입력
CMyIOStream& operator>>(int& _idata) {
scanf_s("%d", &_idata); // 정수 입력
return *this; // 객체 자기 자신 반환
}
// 연산자 오버로딩: 문자열 입력 (1byte 문자열)
CMyIOStream& operator>>(char* _pString) {
scanf_s("%s", _pString, 100); // 최대 100자 입력
return *this; // 객체 자기 자신 반환
}
// 연산자 오버로딩: 문자열 입력 (2byte 유니코드 문자열)
CMyIOStream& operator>>(wchar_t* _pString) {
wscanf_s(L"%s", _pString); // 유니코드 문자열 입력
return *this; // 객체 자기 자신 반환
}
//--------- endl 구현 ---------//
// 함수 포인터를 활용하여 endl 동작 구현
CMyIOStream& operator<<(void(*_pFunc)(void)) {
_pFunc(); // 전달받은 함수 호출
return *this; // 객체 자기 자신 반환
}
// endl은 출력과 관련된 함수이므로 operator>>() 즉, cin은 구현할 필요가 없다.
};
// endl
// endl도 함수이다.
// 이 함수가 호출되면 커서가 아래로 하나 내려갈 뿐이다.
// 이 함수는 operator>>()와 operator<<()가 받아간다.
void MyEndL() {
printf("\n"); // 줄바꿈
}
// 사용자 정의 스트림 객체 생성
CMyIOStream mycout; // mycout : 멤버 함수에 호출된 객체의 주소로, CMyOStream의 this에 해당한다.
int main() {
// 한글 출력이 깨지지 않도록 로케일 설정
// mycout에 그냥 한글을 넣으면 ??로 나오면서 깨진다.
// VS 지역 언어 설정을 표준으로 쓰다보니까 한글 설정이 기본으로 안 되어있을 수 있다.
// 아스키 코드 대응표를 한글 쪽으로 맞춰준다.
setlocale(LC_ALL, "korean");
_wsetlocale(LC_ALL, L"korean");
// cout 테스트
mycout << L"한글" << 123 << L" " << L"cout 테스트" << MyEndL;
// cin 테스트
int input = 0;
char str[100];
wchar_t wstr[100];
mycout << L"숫자 입력: ";
mycout >> input;
mycout << L"입력한 숫자: " << input << MyEndL;
mycout << L"문자열(1바이트) 입력: ";
mycout >> str;
mycout << L"입력한 문자열: " << str << MyEndL;
mycout << L"문자열(2바이트) 입력: ";
mycout >> wstr;
mycout << L"입력한 유니코드 문자열: " << wstr << MyEndL;
return 0;
}
▽ 출력 결과
한글123 cout 테스트
숫자 입력:
▽ 콘솔 창에 아무 숫자와 문자열 입력한 후
한글123 cout 테스트
숫자 입력: 456
입력한 숫자: 456
문자열(1바이트) 입력: 달
입력한 문자열: 달
문자열(2바이트) 입력: 바다
입력한 유니코드 문자열: 바다
'Programming Language > C++' 카테고리의 다른 글
[C++] friend 선언(클래스, 함수) (0) | 2024.04.03 |
---|---|
[C++] vector 내부에 iterator 클래스 구현 (+ 연산자 오버로딩, 복사 생성자) (0) | 2024.04.03 |
[C++] 템플릿 (함수/클래스) (0) | 2024.04.02 |
[C++] 접근 지정자 (0) | 2024.04.01 |
[C++] 래퍼런스 (vs. 포인터) (0) | 2024.04.01 |