일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 시스템호출
- 해시
- 파이썬
- Spring
- nestJS
- 가상면접사례로배우는대규모시스템설계기초
- C++
- @Component
- git
- 카카오 알고리즘
- Nodejs
- 프로그래머스
- nestjs typeorm
- TypeORM
- 카카오
- AWS
- OpenCV
- 카카오 코테
- thymeleaf
- @Autowired
- 코딩테스트
- 구조체배열
- 스프링
- spring boot
- 컴포넌트스캔
- C언어
- 알고리즘
- python
- 코테
- nestjs auth
- Today
- Total
공부 기록장 💻
[C++] string 클래스 - string 문자열 객체 동적 생성, string 멤버 함수 사용 본문
[C++] string 클래스 - string 문자열 객체 동적 생성, string 멤버 함수 사용
dream_for 2021. 4. 7. 14:56(명품 C++ 프로그래밍 ch 4.6)
string 클래스
- C++ 표준 라이브러리에서 제공하는 클래스로서, 문자열을 객체로 다룬다.
- 문자열을 저장하는버퍼와 함께, 문자열을 다루는 함수, 연산자를 멤버로 가지고 있다.
- 문자열의 크기에 맞추어 스스로 메모리크기를 조절한다.
string 클래스를 사용하기 위해선 다음 코드가 필요하다.
#include <iostream>
using namesapce std;
string 객체 생성과 문자열 입력/출력
string 객체 생성 및 출력
스트링 객체를 생성하는 몇 가지 방법이 있다.
1. 빈 문자열
2. 문자열 리터럴로 초기화
3. 다른 스트링 객체를 복사하여 생성
4. C-스트링의 char[] 배열로부터 생성
생성자 | 설명 | 예시 |
1. string() | 빈 문자열 | string str; |
2. string("literal") | 문자열 리터럴로 초기화하여 생성 | string address("서울"); |
3. string(const string& str) | str을 복사한 새로운 객체 생성 | string copyAddress(address); |
4-1. string(const char *s) | C-스트링의 s 문자열을 복사하여 생성 | char text[]="Hello"; string title (text); |
4-2. string(const char *s, int n) | 문자배열 s에서n개의 문자를 복사하여 생성 | string title(text, 2); |
<string 클래스의 주요 생성자>
위의 주요 생성자를 이용하여 예제를 작성하고 출력하여 결과를 확인해보면 다음과 같다.
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main() {
string str; // 빈 문자열을 가진 스트링 객체
string address("서울 성북구"); // 문자열 리터럴로 초기화
string copyAddress(address); // address를 복사한 객체
// C-스트링(char[] 배열)로부터 스트링 객체 생성
char text[] = "Hello"; // C-스트링의 char[] 배열
string title(text); // C-스트링을 문자열 객체로 생성
string title2(text, 2); // n개의 문자만큼 복사
// string 객체의 문자열 출력
cout << str << endl;
cout << address << endl;
cout << copyAddress << endl;
cout << title << endl;
cout << title2 << endl;
}
string 객체의 동적 생성
new, delete 연산자를 이용해 스트링 객체를 동적으로 생성하고 반환할 수 있다.
다음은는 동적으로 생성한 str 객체의 기존 문자열에 또다른 문자열을 추가하여 출력하는 예시이다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string* str = new string("Love"); // 스트링 객체 str 동적 생성
cout << *str << endl; // 문자열 객체 출력
str->append(" You!"); // 기존 str 뒤에 문자열 추가
cout << *str << endl; // 새로 만들어진 문자열 출력
delete str; // 객체 반환
}
string 객체에 문자열 입력
1. cin >> 연산자 이용 (공백 문자 입력되면 이전까지만 하나의 문자열로 다룸)
2. getline() 전역 함수 이용 (문자열의 마지막을 표시하는 구분 문자를 인수로 전달)
getline(cin, str, delimiter);
- 인수: cin, string 객체, 구분자
- 마지막 구분 문자는 문자열에 삽입하지않는다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string name[5]; // string 배열 객체 선언
for (int i = 0;i < 5;i++) {
cout << "이름 >> ";
getline(cin, name[i], '\n');
}
string latter = name[0]; // latter은 사전적으로 가장 뒤에 있는 문자열 저장
for (int i = 1;i < 5;i++)
if (name[i] > latter) // name[i]가 latter 보다 뒤에 온다면
latter = name[i]; // latter 변경
cout << "사전에서 가장 뒤에 나오는 문자열은 " << latter << endl;
}
다음은 입력 받은 영어와 한글에 대한 결과 창이다.
<string 클래스의 주요 멤버 함수>
멤버 함수 원형 | 설명 | 예제 |
string& append(const string& char); | 문자열 연결 문자열 뒤에 str 추가 |
string a("Love"); string b("too"); a.append(" You "); // a = "Love You " a.append(b); // a = "Love You too" string c=a.append(" You ").append(b) // c = "Love You too" |
stinrig& append(const string &str, int pos, int n); | str 문자열 내 pos 위치에서 문자 n개를 현재 문자열 뒤에 추가 | string a("Love"); string b("You very much."); a.append(b, 3, 10); // a = "Love very much" |
string& insert(int pos, const string& str); | 문자열 삽입 문자열의 pos위치에 str삽입 |
string a("Hello."); a.insert(5, ", Hi"); // a = "Hello, Hi." |
string& replace(int pos, int n, const string& str); | 문자열의 pos 위치부터 n개 문자를 str로 대치 | string a("Hello"); a.replace(1, 4, "i"); // a = "Hi" |
int size(); int length(); |
문자열 길이 문자열의 길이 반환 (영어 문자 바이트 - 한글: 한 문자 2바이트) |
string a("Hello"); string b("안녕"); int n = a.size(); // n = 5 int k = b.length(); // k = 4 |
int capacity(); | 할당된 메모리 크기 리턴 | string a("Hello"); string b("안녕"); int n = a.capacity(); // n = 15 int k = b.capacity(); // k = 15 |
string& erase(int pos, int n); | 문자열 삭제 pos 위치부터 n개 문자 삭제 |
string a("Hello"); a.erase(2, 2); // a = "Heo" |
void clear(); | 문자열 모두 삭제. 크기를 0으로 만듬 | string a("Hello"); a.clear(); // 빈 문자열로 변경 |
bool empty(); | 문자열 크기가 0이면 true, 아니면 false 반환 | string a("Hello"); cout<<a.empty()<<endl; // 0 출력 |
char& at(int pos); | pos 위치의 문자 반환 | string a("Hello"); cout<<a.at(a.length() -1)<<endl; // 마지막 문자 'o '출력 |
int find(const string& str); | 문자열의 처음부터 str을 검색하여 발견한 처음 인덱스 반환, 없으면 -1 반환 | string a("Hello"); cout<<a.find("l")<<endl; // 2 출력 |
int find(const string& str, int pos); | 문자열 검색 문자열의 pos 위치부터 str을 검색하여 발견한 처음 인덱스 반환, 없으면 -1 반환 |
int index = 0; string a("Hello lovely"); index = a.find('l', index); while (index > 0) { cout << index << " "; index = a.find('l', index + 1); // 다음 인덱스부터 검색 } // 2 3 6 10 출력 |
int rfind(const strng& str, int pos); | 문자열의 pos 위치부터 str을 검색하여 발견한 마지막 인덱스 반환, 없으면 -1 반환 | |
int compare(const string& str); | 문자열 비교 문자열과 str을 비교하여 같으면 0, 사전 순으로 앞에 오면 음수, 뒤에 오면 양수 반환 |
string a("Hello"); string b("Hi"); cout << a.compare(b) << endl; // 음수 반환 cout << a.compare("Hello") << endl; // 0 반환 cout << b.compare(a) << endl; // 양수 반환 |
strint substr(int pos); string substr(int pos, int n); |
문자열 서브스트링 pos 위치부터 n개 문자를 새로운 서브스트링으로 생성하여 반환 |
string a("Hello lovely"); string c = a.substr(6); // b = "lovely" string b = a.substr(6, 4); // b = "love" |
void swap(string& str); | 현재 객체의 문자열과 str 문자열을 서로 바꿈 | string a("Hello lovely"); string b = a.substr(6, 6); // b = "lovely" a.swap(b); // a = "lovely", b = "hello lovely" cout << a<<endl<<b << endl; |
char* c_str(); | C-스트링 문자열로 반환 |
<string 클래스 연산자>
string s("C++"), s1("C"), s2("Java");
연산자 | 설명 | 예시 | 결과 |
s1=s2 | 문자열 치환 s2를 s1에 치환 |
s1=s2 | s1="Java" |
s [] | s의 [] 인덱스에 있는 문자 반환 | char c=s[1] | c='+' |
s1+s2 | 문자열 연결 s1과 s2를 연결한 새로운 문자열 |
s1+s2 | "CJava" |
s1+=s2 | s1에 s2 연결 | s1+=s2 | s1="CJava" |
s1==s2 | 문자열 비교 s1과 s2가 같은 문자열이면 true |
s1==s2 | false |
s1!=s2 | s1과 s2가 다른 문자열이면 treu | s1!=s2 | true |
s1<s2 | s1이 사전 순으로 s2보다 앞에 오면 true | s1<s2 | true |
s1>s2 | false | ||
s1<=s2 | true | ||
s1>=s2 | false |
문자열의 숫자 변환
전역 함수 stoi() : 문자열 -> 숫자
문자 다루기>
#include <locale>
toupper()
isdigit()
isalpha()
문자열 다루는 예제들
1. 문자열 입력 받아 회전시키며 출력 하기
문자열 길이(length), 서브스트링 생성(substr), 문자열 연결(+연산자)
// 문자열 입력 받아 회전시키며 출력 시키기
#include <iostream>
#include <string>
using namespace std;
int main(void) {
string s;
cout << "아래에 문자열 입력하세요" << endl;
getline(cin, s);
int len = s.length();
for (int i = 0;i < len;i++) {
string first = s.substr(0, 1);
string left = s.substr(1, len-1 );
s = left+first;
cout << s << endl;
}
}
결과:
2. 덧셈 문자열을 입력 받아 덧셈 실행하여 출력
서브스트림 인자 인덱스(substr), 문자열 정수로 변환(stoi)
// 덧셈 문자열을 입력 받아 덧셈 실행
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main() {
string s;
cout << "7+23+10과 같이 덧셈 문자열을 입력하세요." << endl;
getline(cin, s);
cout << endl;
int sum = 0;
int startIndex = 0, index = 0;
while (true) {
index = s.find('+', startIndex);
if (index == -1) // 더이상 뒤에 +가 나오지 않는 경우
{
// 만약 마지막에 숫자로 끝나는 경우 마지막 숫자를 sum에 더하여 저장
if (isdigit(s[startIndex])) {
string sub = s.substr(startIndex);
sum += stoi(sub);
cout << sub << endl;
}
break;
}
// sub에 startIndex부터 +를 찾은 index 사이의 문자열 저장
string sub = s.substr(startIndex, index - startIndex);
startIndex = index + 1;
// 위에서 찾은 서브스트링을 정수로 바꾸어 sum에 더한다.
sum += stoi(sub);
cout << sub << endl;
}
cout << "숫자들의 합은 " << sum<<endl;
}
마지막 '+' 문자를 찾아 해당 인덱스 값을 반환하는 find에서
문자를 찾지 못하고 -1을 리턴하게 되는 경우에 해당하는 조건은 다음과 같이 구현 할 수 있다. (정답 코드)
if (index == -1)
{
string part = s.substr(startIndex);
if (part=="")break;
sum += stoi(part);
cout << part<< endl;
break;
}
결과:
3. & 키가 입력될 때 까지 여러 줄의 영문 문자열을 입력 받고, 찾는 문자열과 대체할 문자열을 받아 문자열을 변경하기
문자열 변경(replace), 입력 버퍼 비우기(cin.ignore)
// & 키가 입력될 때까지 여러 줄의 영문 문자열을 입력 받고, 찾는 문자열과 대체할 문자열을 입력 받아 전체 문자열 변경
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cout << "여러 줄의 문자열을 입력하세요. 입력의 끝은 &입니다." << endl;
getline(cin, s, '&');
cin.ignore(); // '&' 다음에 오는 개행 문자를 입력 버퍼로부터 제거
string sFind, sReplace;
cout << endl << "find: ";
getline(cin, sFind);
if (s.find(sFind, 0) == -1) {
cout << "해당 문자열을 찾지 못함" << endl;
return 0;
}
cout << "replace: ";
getline(cin, sReplace);
int startIndex = 0;
while (true) {
// startIndex부터 sFind 문자열을 찾는다.
int index = s.find(sFind, startIndex);
// 더이상 찾지 못하면 반복문 벗어남
if (index == -1)break;
// sFind를 replace로 바꾼다.
s.replace(index, sFind.length(), sReplace);
startIndex = index + 1;
}
// 바뀐 문자열 s를 출력
cout << endl<< s << endl;
}
결과:
찾을 문자열이 포함되어 있지 않은 경우:
'# Language & Tools > C++' 카테고리의 다른 글
[C++] 동적 메모리 사용 - 포인터/배열, 객체 동적 생성, new/delete 연산자, 동적 할당과 반납, this 포인터 (0) | 2021.04.10 |
---|---|
[C/C++] 문자열 처리 함수 c_str(), atoi(), stoi() (0) | 2021.04.09 |
[C++] 클래스와 객체 - 클래스 선언부/구현부, 생성자, 소멸자, 멤버 접근 지정자, 자동 인라인함수, 구조체 (0) | 2021.04.06 |
[C++] 문자열 입력 - <cstring> cin.getline, <string> - getline (0) | 2021.04.06 |
명품 C++ Programming 2장 실습 문제 - C++ 표준 입출력, cin, cout, string 객체, getline 함수 (0) | 2021.03.18 |