문자열
문자 배열 str1을 출력하는 것은
char str1[] = {'h','e','l','l','o'};
이다.
이걸 실행해 보면 마지막 글자 뒤에 이상한 문자가 쓰여 있을 것이다. 이유는 배열 마지막에 NULL이 들어오는데 이 NULL부분('\0')을 처리해주지 않으면 다음 줄에 그대로 출력되어 버퍼 오버플로우나 쓰레기값이 뜬다. 이 쓰레기 값을 해결하려면 끝에 '\0'을 붙이는데 매번 끝에 '\0'을 붙이기 수고스러우니 C++은 큰 따옴표로 묶어서 문자열을 나타낸다.
그러면 NULL이 자동으로 대입된다.
char str1[] = "Hello";
String 클래스
string 클래스는 STL에서 제공하는 클래스로 문자열을 다루는 클래스이다. char*또는 char []의 형태로 문자열을 다뤘다면 C++에서는 문자열을 하나의 변수 type처럼 사용하며, 문자열을 훨씬 다양하고 쉽게 다룰 수 있게 해 준다.
char*, char []과 다르게 문자열의 끝에 '\0' 문자가 들어가지 않으며, 문자열의 길이를 동적으로 변경 가능하다.
String 클래스 사용
<string> 헤더파일을 추가해주어야 한다.
#include <string>
using namespace std;
int main()
{
string s; // string 객체 s를 생성한다.
string s= "Hello World!"; // string 객체를 생성하고 초기화 한다
string s{"Hello World!"}; // string 객체를 생성하고 초기화 한다.
return 0;
}
문자열의 결합
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s1 = "Slow", s2= "steady";
string s3 = "the race.";
string s4;
s4 = s1+ " and " + s2 + " wins " + s3;
cout << s4 << endl;
return 0;
}
문자열의 비교
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s1 = "Slow", s2= "World";
if(s1==s2)
cout << "동일한 문자열입니다." << endl;
else
cout << "동일한 문자열이 아닙니다." << endl;
if(s1>s2)
cout << "사전순에서"<<s2<<"가"<<s1<<"앞에 있습니다. " << endl;
else
cout << "사전순에서"<<s1<<"가"<<s2<<"앞에 있습니다. " << endl;
return 0;
}
문자열의 배열
#include <string>
#include <iostream>
using namespace std;
int main()
{
string list[] = {"철수","영희","길동"};
for (auto x: list) // auto : "타입 추론" 배열의 변수와 같은 자료형으로 변환해줌, 범위 기반 for문
cout << x + "야 안녕!" << endl;
return 0;
}
getline()
- 공백이 포함된 문자열을 입력받을 수 있는 함수 (in string 라이브러리)
- string str;
getline(cin, str)
cin.getline(문자열을 저장할 공간, 최대크기)
- 공백이 포함된 문자열을 입력받을 수 있는 함수( in iostream 라이브러리 )
- char arr2 [30];
cin.getline(arr2,30);
사용자로부터 이름과 주소를 받아서 친근하게 인사하는 프로그램을 작성#include <iostream> #include <string> using namespace std; int main() { string name, address; cout << "이름을 입력하시오 : "; getline(cin, name); cout << "주소를 입력하시오 : "; getline(cin, address); cout << address << "의 " << name << "씨 안녕하세요?"<<endl; }
cin.ignore()
- 입력 버퍼를 비워주는 함수
- cin으로 입력받을 경우, 버퍼에 '\n'이 남음
- cin다음 입력을 cin으로 받을 경우 전 버퍼에 있던 공백 및 개행 문자를 무시하기 때문에 버퍼를 비워즐 필요가 없음.
- cin 다음 입력을 getline으로 받을 경우, 전 버퍼에 있던 공백 및 개행 문자를 포함해서 입력받기 때문에 버퍼를 지워주는 작업이 필요.
- getline 다음 입력을 getline으로 받을 경우, getline은 '\n'를 버퍼에 포함시키지 않기 때문에 버퍼를 비워줄 필요가 없음.
string 클래스 멤버 함수
멤버 함수 | 설명 |
s[i] | i번째 원소, index범위 체크 X |
s.at(i) | i번째 원소, index범위 체크 O |
s.length(),s.size() | 문자열 길이 |
s.empty() | s가 비어있으면 true 반환 |
s.insert(pos,s2) | s의 pos 위치에 s2를 삽입 |
s.find(s2) | s에서 문자열 s2가 발견되는 첫번째 인덱스를 반환 |
s.find(s2,pos) | s의 pos위치부터 문자열 s2가 발견되는 첫번째 인덱스를 반환 찾는 문자열이 없는 경우 반환값은 string::npos |
s.push_back('문자') | 문자열 맨 뒤에 문자 하나 더하기 |
s.pop_back() | 문자열 맨 뒤에 있는 문자 하나 없애기 |
s.front() | 첫번째 항목 반환 |
s.back() | 마지막 항목 반환 |
s.substr(pos,n) | s의 pos 위치에서부터 n개의 문자를 리턴 |
clear() | 문자열을 비워줌 |
to_string(정수) | int -> string |
stoi(문자열) | string -> int |
swap(str1, str2) | 문자열 2개 바꾸기 |
문자열 지우기
- 매개변수가 숫자일 때
1) 매개변수가 1개일 때 :
str.erase(7); // 문자열 인덱스 7부터 끝까지 삭제, I love
2) 매개변수가 2개일 때 :
erase(7,4) //문자열 인덱스 7에서 4 길이만큼 삭제, you!
2. 매개변수가 반복자 일 때
1) 매개변수가 1개일 때 :
str.erase(str.begin()); // 반복자가 가리키는 지점만 삭제, love you!
2) 매개변수가 2개일 때 :
str.erase(str.begin(), str.end()-4); // you!
문자열 치환
1. replace
대상 문자열에서 지정한 위치부터 원하는 문자로 바꿔줌
문자열.replace(시작 위치, 길이, 치환 문자열)
2. regex_replace
대상 문자열에서 정규식으로 지정한 문자를 검색하여 문자열로 변환
#include <regex>
regex_replace(대상 문자열, regex(정규식), 치환 문자열)
문자 위치 찾기
문자열 "When in Rome, do as the Romans."중에서
"Rome"이 몇 번째 위치에 있는지를 계산하는 프로그램을 작성.#include <iostream> #include <string> using namespace std; int main() { string str; getline(cin, str); cout << str.find("Rome") << endl; }
특정 문자 삭제하기
사용자가 입력한 주민등록번호에서 '-' 문자를 삭제하는 프로그램을 작성.#include <iostream> #include <string> using namespace std; int main() { string str; getline(cin, str); cout << str.erase(str.find("-"), 1) << endl; }
'C++' 카테고리의 다른 글
<C++> 6. 배열과 벡터 (1) | 2024.03.26 |
---|---|
<C++> 5. 함수 (0) | 2024.03.25 |
<C++> 4. 제어구조 (0) | 2024.03.19 |
<C++> 2. 입출력 (0) | 2024.03.05 |
<C++> 1. 자료구조 (0) | 2024.03.04 |