1. Character Functions
#include <cctype> //문자의 종류를 T/F로 판단하는 함수 및 소문자 <-> 대문자로 변경해주는 함수를 제공한다 (c-style character based functions)
int main()
{
char c = 'A';
isalpha(c); //c가 문자이면 true
isalnum(c); //c가 문자거나 숫자이면 true
isdigit(c); //c가 숫자면 true
islower(c); //c가 소문자면 true
isprint(c); //c가 print가능한 문자면 true
ispunct(c); //c가 쉼표(,) 마침표(.) 등의 문장기호면 true
isupper(c); //c가 대문자면 true
isspace(c); //c가 space면 true
tolower(c); //c의 소문자를 반환한다
toupper(c); //c의 대문자를 반환한다
}
2. C-Style String
string은 char들이 연속적으로 메모리에 저장되어 있는것이다
string은 char타입의 배열이다 (배열 구문으로 문자열 속 문자에 접근이 가능하다)
문자열의 끝은 null이다 (숫자 0 -> 아스키코드 null) 따라서 "Kelvin"은 총 7칸짜리 배열이다
바꿀수 없는 literal string은 " "와 같은 string이다
"문자열"과 같은 경우 따로 문자열의 끝에 null처리를 하지 않아도 C++에서 자동으로 처리한다
C-Style 문자열을 사용할 경우 null을 침범하지 않도록 조심해야 한다, 배열의 크기를 넘어서지 않는 문자열을 할당해야 한다
int main()
{
//C-Style
char MyName[]{ "Kelvin" }; //K e l v i n \0으로 char타입의 배열이 구성되어 있다
MyName[6] = 'p'; //null자리에 다른 문자를 넣으면 안된다
char MyName2[10] = { "Kelvin" };
MyName2[7] = 'p'; //null이 존재하기 때문에 가능
char MyName3[20];
MyName3 = "Kelvin"; //compile error!
}
#include <cstring> //문자열에서 복사/연결/비교/검색/길이 등 다양한 기능을 제공한다 (c-style string based functions)
int main()
{
char MyName3[20];
MyName3 = "Kelvin"; //compile error!
strcpy_s(MyName3, "Kelvin"); //문자열 할당 (MyName3에는 Kelvin이 할당됨)
strcat_s(MyName3, "there"); //문자열 이어붙이기 (MyName3는 Kelvinthere가 됨)
strlen(MyName3); //문자열 길이 반환 (11이 출력됨 null제외)
strcmp(MyName3, "Another"); //두 문자열이 같으면 0, 다를경우 아스키코드를 비교하여 좌측 문자열이 더 작으면 음수 좌측 문자열이 더 크면 양수를 반환한다 ex) strcmp("ABCD", "ABDD") 1반환
}
#include <cstdlib> //String To OtherType으로 Convert해주는 함수들을 제공한다
#include <cctype>
#include <cstring>
int main()
{
char Full_Name[50]{};
cout << "Please enter your full name:";
cin >> Full_Name; //이때 Kelvin Park을 하고 출력 시 Kelvin만 나오게 된다 (cin에서 space를 만나 입력이 끝났기 때문)
//이를 해결하기 위해 아래와 같은 함수를 사용한다
cout << "Please enter your full name:";
cin.getline(Full_Name, 50); //50이란 숫자는 limit이다 (50번째 글자까지 입력 받아야 한다는 의미)
cout << Full_Name << endl; //space가 있어도 끊기지 않고 입력을 받는다 (50번째까지) (Kelvin Park으로 출력됨)
}
3. size_t
std::size_t는 어떤 타입의 사이즈든지 나타낼 수 있는 충분한 bytes를 가진 unsigned integer이다
ex) int와 size_t가 같은 width를 가진 때를 제외하면, size_t는 항상 int보다 더 많은 숫자를 저장할 수 있다
size_t는 보통 문자열이나 메모리의 사이즈를 나타낼 때 사용한다
size_t 는, 32비트 운영체제에서는 "부호없는 32비트 정수"이고, 64비트 운영체제에서는 "부호없는 64비트 정수"이다
그러나 "unsigned int" 또는 "int"는, 64비트 OS라고 해서 꼭 64비트 정수는 아니다 여전히 32비트일 수도 있다
이것이 size_t형과 "unsigned int"형의 차이이다
4. C++ Style String
c++에서 문자열 타입은 string이다
string은 std namespace이다 따라서 std::string이다 (따라서 :: scope없이 사용하려면 using namespace std; 선언을 해주어야 한다)
c-style 문자열과 마찬가지로 연속적인 메모리 구조이다
c-style 문자열과 다르게 크기가 동적이다 (dynamic size)
c++ string에는 다양한 함수들이 존재한다
c++ string은 기존의 연산자 (operator)들을 사용이 가능하다 (ex) +, =, <, <=, ==, != 등등)
필요하다면 c-style문자열로 쉽게 convert가 가능하다
c++ string은 c-style 문자열보다 안전하다 (bound check, error출력 등)
c++string은 선언 후 초기화 하지 않아도 자동 초기화 된다
c++ string은 cout, cin에 잘 동작한다 (일반 cin을 사용하면 space를 만나면 입력이 끊긴다)
이 이외에도 아주 다양한 기능이 존재한다
#include <string> //C++ 문자열을 사용하기 위한 헤더파일
using namespace std;
int main()
{
string s1; //자동 초기화 (빈 문자열)
string s2{ "Kelvin" };
string s3{ s2 }; //s2의 문자열을 할당 (문자열은 같지만 s3, s2의 주소는 다르다)
string s4{ "Kelvin", 3 }; //해당 숫자까지만 사용한다 (s4에는 Kel이 들어간다)
string s5{ "Kelvin", 0, 2 }; //문자열에서 원하는 시작부터 원하는 끝까지 끊어서 사용한다 (0부터 2개까지만 사용 (Ke가 들어간다))
string s6{ 3, 'A' }; //원하는 문자를 원하는 만큼 사용한다 (AAA가 된다)
}
int main()
{
string s7;
s7 = "Kelvin"; //대입 연산자 사용 가능, strcpy_s보다 훨씬 간단하다, 문자열 변수의 크기가 동적으로 조절된다
string s8{ "Park" };
s7 = s8; //대입 연산자 사용 가능
string part1{ "Hello" };
string part2{ "My Name is Kelvin" };
string sentence;
sentence = part1 + part2; //+ 연산도 사용 가능하다 (+=도 가능)
sentence = "Hello" + "My Name is Kelvin"; //c-style문자열이기 때문에 +연산자 사용이 불가능하다 (error)
string Temp2{ "Apple" };
string Temp3{ "Banana" };
bool a = Temp2 == Temp3; //비교 연산자 사용 가능 (> >=, < <=는 아스키코드로 비교한다)
}
int main()
{
string Temp1{ "Kelvin" };
Temp1[0]; //배열과 마찬가지로 []연산자 사용이 가능하며 내부 character에 접근이 가능하다 (K)
Temp1.at(0); //vector와 마찬가지로 at()연산자 사용도 가능하다 -> Bound체크로 index가 string의 범위를 넘어서는지 아닌지 check해준다
//그 외에도 컨테이너가 사용할 수 있는 foreach문도 사용이 가능하다
for (char c : Temp1)
{
cout << c << endl; // K e l v i n 출력
}
for (int i : Temp1)
{
cout << i << endl; // K e l v i n이 아스키코드로 변환되어 출력된다
}
}
int main()
{
string Test1{ "This is a Test" };
Test1.substr(0, 4); //원하는 시작지점 부터 원하는 글자만큼 substring한다 (0번째 부터 4글자만큼 substring해서 This를 반환한다)
//find로 원하는 문자열/문자의 시작 위치를 알 수 있다 만약 찾는 문자열/문자가 없다면 string::npos를 반환한다(if문에서 체크가 가능하다 == string::npos 이런식으로)
Test1.find("This"); //0
Test1.find('a'); //8
//clear로 문자열 전체를 지울 수 있다 (빈 문자열이 된다)
Test1.clear();
//erase로 원하는 문자열을 지울 수 있다
Test1.erase(0, 5); //원하는 시작지점 부터 원하는 글자수 만큼 제거가 가능하다 (is a Test가 된다)
//length로 문자열의 길이를 알 수 있다
Test1.length(); //14가 나온다
getline(cin, Test1); //getline으로 space를 만나도 입력을 끊기게 하지 않을 수 있다 ex) Kelvin Park을 입력시 기존 cin은 Kelvin만 들어가지만 getline은 Test1에 Kelvin Park이 다 들어가게 된다 c-style 문자열의 cin.getline()과 같은 기능
getline(cin, Test1, 'a'); //입력 중 마지막에 넣은 문자를 입력 시 입력을 끝나게 할 수 있다 ex) Kelvina를 치는 순간 입력이 종료되며 a는 빠지게 된다 (delemeter)
}
'C++' 카테고리의 다른 글
| 11. Function (2) (108) | 2024.01.26 |
|---|---|
| 10. Function (1) (127) | 2024.01.25 |
| 8. Control Program Flow (2) (113) | 2023.12.21 |
| 7. Control Program Flow (1) (89) | 2023.12.20 |
| 6. Operators (연산자) (131) | 2023.12.12 |