프로그래밍 기초 with C++ 2일차

김동현·2022년 6월 17일
0

2022.06.17

STL

문자열 라이브러리

string

std::string

std::wstring

std::string_view : 읽기전용 string이 무거워서 나왔다. (C++ 17 부터 사용)

예제

#include <iostream>
#include <string> // std::string을 쓰고 싶다면 이 헤더를 포함해야 한다.
#include <assert.h>

// string_view 는 문자열 삽입과 삭제가 불가능하다.
// 문자열 추출때 string_view 로 나온다.
// string 에서 string_view 로 변환 가능하다.
// string_view 는 문자열을 가르키는 주소값(pointer)과 크기(size)만 가지고 있어서 가볍다.

int main()
{
    std::string s = "Hello";  // 초기화
    std::cout << s << "\n";

	std::string v = "Hello"s; // string 타입
    std::string b = "Hello"sv; // string_view 타입

    // empty()로 빈 문자열인지 확인할 수 있다.
    if (s.empty()) // bool 타입으로 비어있으면 true 아니면 false
    {
        std::cout << "빈 문자열이다.\n";
    }

    // length() / size()로 문자열의 길이를 알 수 있다.
    std::cout << "이 문자열의 길이는 " << s.length() << "\n";
    // std::cout << "이 문자열의 길이는 " << s.size() << "\n";

    // [] 연산자로 각 문자에 접근할 수 있다.
    // front()로 첫 번째 문자에, back()으로 마지막 문자에 접근할 수 있다.
    // 문자열처럼 되는것
    std::cout << "이 문자열의 3번째 문자는 " << s[2] << "\n";
    std::cout << "이 문자열의 1번째 문자는 " << s.front() << "\n";
    std::cout << "이 문자열의 마지막 문자는 " << s.back() << "\n";

    // clear()로 빈 문자열로 만들 수 있다.
    s.clear();
    if (s.empty())
    {
        std::cout << "빈 문자열이다.\n";
    }

    // push_back() / append() / + 연산자로 맨 끝에 문자(열)를(을) 삽입할 수 있다.
    s.push_back('H');   // "H"
    s.append("ello");   // "Hello"
    s += " World!";     // "Hello World!"
    std::cout << s << "\n";

    // insert()로 문자(열)를(을) 중간에 삽입할 수 있다.
    s.insert(5, " Inserted"); // "Hello Inserted World!"
    std::cout << s << "\n";

    // pop_back()으로 마지막 문자를 삭제할 수 있다.
    s.pop_back(); // "Hello Inserted World"
    std::cout << s << "\n";

    // erase()로 문자(열)를(을) 삭제할 수 있다.
    // [5] ~ [9] 삭제
    s.erase(5, 9); // "Hello World"
    std::cout << s << "\n";

    // ==, !=, <, > 연산자로 문자열을 비교할 수 있다.
    if (s == "Hello World")
    {
        std::cout << "Hello World와 같다.\n";
    }

    if (s != "Hello")
    {
        std::cout << "Hello와 다르다.\n";
    }

    if (s > "Hello")
    {
        std::cout << s << "가 Hello 뒤에 나온다.\n";
    }

    if (s < "Idle")
    {
        std::cout << s << "가 Idle 전에 나온다.\n";
    }

    // substr()로 문자열을 추출할 수 있다.
    // [6] 부터 추출
    std::cout << s.substr(6) << "\n";       // "World"

    // [0] ~ [5] 추출 반환은 string 으로 받음
    std::cout << s.substr(0, 5) << "\n";    // "Hello"

    // 숫자와 문자열 간 변환도 가능하다.
    s = "3.14";
    std::cout << s << "\n";
    // string to float

    float f = std::stof(s); // f(3.14)
    s = "142";
    std::cout << s << "\n";

    // string to int
    int i = std::stoi(s); // i(142)
    s = std::to_string(f); // s("3.14")

    // 입력도 받을 수 있다.
    std::cout << "단어를 입력해주세요. : ";
    std::cin >> s;
    std::cout << s;
    std::cin.get(); // HACK : 개행 문자 삭제
    std::cout << "문장을 입력해주세요. : ";
    std::getline(std::cin, s);
    std::cout << s << "\n";

    return 0;
}

입출력 라이브러리

2가지 형태로 제공됩니다.
객체지향적으로 만들어진 스트림 기반의 라이브러리와
C 스타일의 입출력 함수가 있다.

예제

정렬하기 편한것은 printf( ) 이다.
둘다 사용방법을 잘 익혀 사용하자.

#include <iostream> // 표준 파일 입출력은 이 헤더를 포함해야 한다.
#include <iomanip>  // 입출력과 관련된 조작을 위한 헤더다.

int main()
{
    // 출력은 << 연산자를 사용하면 된다.
    std::cout << "Hello World!\n";

    // 포맷팅도 가능하다.
    // 1. 정수 관련 포맷
    std::cout << 12 << "\n";     // "12"
    std::cout << std::hex;       // 16진수로 출력한다. // 한번 설정하면 계속 적용된다.
    std::cout << 12 << "\n";     // "c"
    std::cout << std::showbase;  // 진법을 표현한다.
    std::cout << 12 << "\n";     // "0xc"
    // 다시 원래대로 되돌린다.
    std::cout << std::dec << std::noshowbase; // dec : 10진수로 표현한다.

    // 2. 실수 관련 포맷
    std::cout << 12.34 << "\n";         // "12.34"
    std::cout << std::fixed;            // 소수점 자리를 고정시켜 표현한다. // fixed : 6자리로 소수점을 고정시킨다.
    std::cout << 12.34 << "\n";         // "12.340000"
    std::cout << std::setprecision(12); // 소수점 자리를 12자리로 고정한다. // setprecision(__) 괄호 안의 자리 수로 소수점을 고정시킨다.
    std::cout << 12.34 << "\n";         // "12.340000000000"
    // 다시 원래대로 되돌린다.
    std::cout << std::defaultfloat << std::setprecision(6); // 소수점 고정 초기화 시키는 것

    // 3. 불리언 관련 포맷
    std::cout << std::boolalpha;    // 불리언 값을 출력할 때 숫자 대신 문자로 출력한다. // bool 타입은 원래 숫자로 출력된다. false : 0 / true : 1
    std::cout << true << "\n";      // "true"
    // 다시 원래대로 되돌린다.
    std::cout << std::noboolalpha;  // bool 을 다시 숫자로 표현한다.

    // 4. 정렬 관련 포맷
    std::cout << std::setfill('*'); // 공백대신 *출력 // setfill( ) : ( ) 안에 있는 문자로 공백을 표현한다.
    std::cout << std::setw(12);     // 출력 길이를 일시적으로 12로 지정한다. // setw( ) : ( )안의 수 만큼 무조건 딱 한번만 출력

    std::cout << std::left;         // 왼쪽 정렬
    std::cout << std::hex << std::showbase;
    std::cout << 42 << "\n";        // "0x2a********"
    std::cout << 42 << "\n";        // "0x2a"

    std::cout << std::setw(12);     // 출력 길이를 일시적으로 12로 지정한다. // setw( ) : ( )안의 수 만큼 무조건 딱 한번만 출력
    std::cout << std::right; // 오른쪽 정렬
    std::cout << 42 << "\n"; // "********0x2a"
    std::cout << 42 << "\n"; // "0x2a"

    // 다시 원래대로 되돌린다.
    std::cout << std::setfill(' ');
    std::cout.width(0);

    // 입력은 >> 연산자를 사용하면 된다.
    std::cout << "숫자를 입력하세요 : ";
    int num;
    std::cin >> num;

    // good() / fail()로 오류 여부를 알 수 있다. // 입력과 출력에서 오류여부를 알 수 있따.
    if (std::cin.good()) // 숫자를 입력하면 실행됨
    {
        std::cout << "숫자를 입력함.\n";
    }
    else if (std::cin.fail()) // 숫자가 아닌것을 입력하면 실행됨
    {
        std::cout << "숫자가 아닌 다른 값을 입력함.\n";
        std::cin.clear(); // clear()를 사용하면 객체를 정상화할 수 있다.
    }

    // bool 타입으로 변환이 가능하다.
    if (std::cin) // if (std::cin.good())랑 같다 // if에 작성하는 조건식의 타입은 bool이다.
    {
        std::cout << "오류가 없음.\n";
    }
    else
    {
        std::cout << "오류 발생함.\n";
    }

    return 0;
}

예제2

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
	std::string name[5] = { "김재성", "용준헌", "김재민", "김동현" };
	std::string age[3] = { "31", "28", "25" };



	cout << "---------------------------" << endl;
	
	cout << std::setw(12) << std::left << "|Name" << " | " << std::setw(12) << std::right << "Age|" << endl;
	cout << "---------------------------" << endl;
	cout << "|" << std::setw(12) << std::left << name[0] << "|" << std::setw(12) << std::right << age[0] << "|" << endl;
	cout << "|" << std::setw(12) << std::left << name[1] << "|" << std::setw(12) << std::right << age[1] << "|" << endl;
	cout << "|" << std::setw(12) << std::left << name[2] << "|" << std::setw(12) << std::right << age[2] << "|" << endl;
	cout << "|" << std::setw(12) << std::left << name[3] << "|" << std::setw(12) << std::right << age[1] << "|" << endl;
	cout << "---------------------------" << endl;

}

파일 입출력

#include <iostream>
#include <fstream> // 파일 입출력을 위한 헤더다.
#include <string>

int main()
{
    // 파일 출력은 ofstream을 이용한다.
    std::ofstream of("temp.txt");

    // 사용법은 표준 파일과 비슷하다.
    of << "Hello World!";

    // close()로 명시적으로 파일을 닫을 수 있다.
    // 물론 굳이 하지 않아도 소멸자에서 자동으로 호출한다.
    of.close();

    {
        // 파일 입력은 ifstream을 이용한다.
        std::ifstream ifs;  

        // is_open()으로 파일을 열었는지 확인할 수 있다.
        if (false == ifs.is_open())
        {
            // open()으로 파일을 열 수 있다.
            ifs.open("temp.txt");
        }

        std::string str;
        std::getline(ifs, str);  // ifs으로부터 문자열을 쭉 출력한 것
        std::cout << str << "\n";  // "Hello World!" 가 출력 

        // eof()로 파일의 끝에 도달했는지 알 수 있다.
        if (ifs.eof())
        {
            std::cout << "파일의 끝에 도달함.\n";
        }
    } // 자동으로 ifs.close()가 호출된다.

    // 바이너리 모드로 열고 싶다면 ios::binary를 넘겨준다.
    std::ofstream of2("temp.bin", std::ios::binary);

    return 0;
}

파일 입출력 및 문자열 입출력 예제

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
	std::ofstream of("myFile.txt");		// 파일 생성


	std::string name[5] = { "김재성", "용준헌", "김재민", "김동현" };
	std::string age[4] = { "31", "28", "25", "28"};

	of << "---------------------------" << endl;		// 파일에 넣어주는거
	
	of << std::setw(12) << std::left << "|Name" << " | " << std::setw(12) << std::right << "Age|" << endl;
	of << "---------------------------" << endl;
	of << "|" << std::setw(12) << std::left << name[0] << "|" << std::setw(12) << std::right << age[0] << "|" << endl;
	of << "|" << std::setw(12) << std::left << name[1] << "|" << std::setw(12) << std::right << age[1] << "|" << endl;
	of << "|" << std::setw(12) << std::left << name[2] << "|" << std::setw(12) << std::right << age[2] << "|" << endl;
	of << "|" << std::setw(12) << std::left << name[3] << "|" << std::setw(12) << std::right << age[3] << "|" << endl;
	of << "---------------------------" << endl;



	std::stringstream ss1;		// 문자열 생성
	std::stringstream ss2;		// 이하동문
	std::stringstream ss3;
	std::stringstream ss4;
	std::stringstream ll;
	std::stringstream ll2;


	ll << "---------------------------" << endl;		// 문자열에 출력문구 넣기

	ll2 << std::setw(12) << std::left << "|Name" << " | " << std::setw(12) << std::right << "Age|" << endl;

	ss1 << "|" << std::setw(12) << std::left << name[0] << "|" << std::setw(12) << std::right << age[0] << "|" << endl;
	ss2 << "|" << std::setw(12) << std::left << name[1] << "|" << std::setw(12) << std::right << age[1] << "|" << endl;
	ss3 << "|" << std::setw(12) << std::left << name[2] << "|" << std::setw(12) << std::right << age[2] << "|" << endl;
	ss4 << "|" << std::setw(12) << std::left << name[3] << "|" << std::setw(12) << std::right << age[1] << "|" << endl;

	std::string str;

	str = ll.str();		// str()을 이용하여 stringstream 에 있는 문자열을 std::string 객체로 변환
	cout << str;		// 출력
	str = ll2.str();
	cout << str;
	str = ll.str();
	cout << str;
	str = ss1.str();
	cout << str;
	str = ss2.str();
	cout << str;
	str = ss3.str();
	cout << str;
	str = ss4.str();
	cout << str;
	str = ll.str();
	cout << str;

	of.close();

	{
		std::ifstream myFile;

		if (false == myFile.is_open())
		{
			myFile.open("myFile.txt");
		}

		if (myFile.eof())
		{
			std::cout << "파일의 끝에 도달함.\n";
		}
	}
	
}

myFile.txt 에 저장하고 문자열 ll, ss 등등에 저장하고 출력을 해 보았다.

저장도 출력도 잘 된다.

여러번 반복해야될 문자열을 저장하여 필요할때마다 꺼내 쓸 수 있는게 좋아보인다.

수학 라이브러리

https://en.cppreference.com/w/cpp/numeric

라이브러리 참고하자.
삼각함수 선형구간정도 알면 좋다.

알고리즘 라이브러리

https://en.cppreference.com/w/cpp/algorithm

알고리즘은 유용한것이 많아
ranges 는 넘기자

all_of / any_of

count / count_if

find / find_if / find_if_not

max / min

등 알고리즘 라이브러리를 한번 찾아보자

profile
해보자요

0개의 댓글