2022.06.17
문자열 라이브러리
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;
}
#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
등 알고리즘 라이브러리를 한번 찾아보자