C++에서 문자열을 다루는 방법은 기존의 C에서 사용했던
- C-스트링
- string 클래스
2가지가 있다.
C-스트링은 C 언어에서 사용하던 전통적인 문자열로서, '\0'로 끝나는 문자 배열을 문자열로 취급하는 방법이다.
String은 C++표준 라이브러리에서 제공하는 클래스로, 문자열을 객체로 다룬다.
string은 문자열을 저장하는 버퍼와 함께, 문자열을 다루는 다양하고 유용한 함수와 연산자들을 멤버로 가지며, 개발자들이 C-스트링보다 문자열을 쉽게 다룰 수 있다.
string 클래스 사용을 위한 코드
#include <string>
using namespace std;
C-스트링은 초기에 할당받은 메모리 크기 이상의 문자열을 저장할 수 없기에 개발자의 프로그램 작성에 어려움이 있다
String 클래스는 문자열의 크기에 맞춰 스스로 메모리 크기를 조절하기에 사용하기 매우 편하다.
string str = "I love "; //str은 공백포함 7개 문자
str.append("C++. "); //std은 "I love C++."이 된다.
✅String 객체 생성 및 출력
String 객체 생성
string 클래스의 생성자를 이용해 다양한 문자열을 생성할 수 있다. 문자열 크기에는 제한이 없다.
string str; //빈 문자열을 가진 스트링 객체
string address("서울시 성북구 삼선동 389"); //문자열 리터럴로 초기화
string copyAddress(address);
char text[ ] ={ 'L', 'O', 'V', 'E', ' ', 'C', '+', '+', '\0'}; //C스트링
string title(text); // 'Love C++'을 지닌 객체 string 생성
String 객체가 가진 문자열 출력
string 객체의 문자열은 cout <<를 이용해 화면에 출력 가능
cout << address << endl; //"위에서 address에 입력한 값을 출력"
cout << title << endl; //마찬가지로 위에서 title에 입력한 값을 출력
String 객체의 동적 생성
string객체도 똑같이 new와 delete를 통해 연산자를 동적으로 생성하고 반환할 수 있다.
string *p=new string("C++");
cout << *p;
p-<append("Great!!");
cout << *p; // "C++ Great!!" 출력
delete p; // 스트링 객체 반환
string 클래스의 주요 생성자
생성자 | 설명 |
string() | 빈 문자열을 가진 스트링 객체 생성 |
string(const string& str) | str을 복사한 새로운 스트링 객체 생성 |
string(const char* s) | C-스트링 s의 문자열을 복사해 스트링 객체 생성 |
string(const char* s, int n) | 문자 배열 s에서 n개의 문자를 복사해 스트링 객체 생성 |
String 객체에 문자열 입력
string 객체에 문자열 입력
cin >>을 이용해 키보드로부터 string 객체에 문자열을 입력받을 수 있다.
string name;
cin >> name;
>> 연산자는 사용하기 쉬우나, 공백 문자가 입력되면 그 앞까지 하나의 문자로 다루기에 공백 문자를 포함하는 문자열을 사용할 수 없다. <string> 헤더 파일에 선언된 getline() 전역 함수를 이용
getline()으로 공백 문자가 낀 한 라인의 문자열을 입력받으면
string name;
getline(cin, name, '\n'); // '\n'을 만날 때까지 키보드 (cin)로부터 문자열을 읽어 name에 저장
String의 getline()은 첫번째 인자에는 cin을, 두 번째 인자에는 string 객체를, 세 번째 인자에는 문자열의 마지막을 표시하는 구분 문자(delimiter)를 준다. 위 예시는 name이 '\n'을 만날 때까지 입력된 문자들을 name객체에 문자열로 저장하는 코드다. '\n'은 문자열에 삽입하지 않는다.
✅문자열 다루기
문자열 치환
문자열 치환은 =연산자를 이용
string a = "Java", b = "C++";
a = b; // a="C++"이 된다. a는 b를 복사한 문자열을 가진다.
문자열 비교
문자열 비교는 compare() 함수를 이용한다. 이 함수는 두 문자열이 같으면 0, str보다 사전 순으로 앞에 오면 음수, 뒤에 오면 양수를 리턴한다.
string name = "chang";
stringalias = "ch";
int res = name.compare(alias);
if(res == 0) cout << "두 문자열이 같다.";
else if(res<0) cout<< name << " < " << alias << endl; //name이 앞에 옴
else cout << alias << " < " << name << endl; //name이 뒤에 옴
문자열 비교는 비교연산자를 이용하면 보다 효과적이다
if(name == alias) cout << "두 문자열이 같다";
if(name < alias) cout << name << "이 " << alias << "보다 사전에서 먼저 나온다";
문자열 연결
두 개의 문자열을 연결하기 위해 append()함수를 이용한다.
"I" 문자열 끝에 "love"를 추가하는 예
string a("I");
a.append(" love "); //a = "I love "
문자열 연결은 +, += 연산자를 통해 쉽게 작성 가능
string a("I love C++");
string b(" . ");
string c(;
c = a + b; //c = "I love C++."로 변경됨
c += b; //c= "I love C++.."로 변경됨
문자열 삽입
string 클래스는 문자열에 새로운 문자열이나 문자의 삽입 삭제가 가능하며, 문자의 일부분을 다른 문자들로 변경 가능
insert()함수를 이용해 a의 인덱스 2 위치에 "really" 문자열을 삽입하는 코드이다.
string a("I love C++");
a.insert(2, "really "); // a = "I really love C++"
replace 함수를 통해 a의 인덱스 2부터 11개의 문자("really love")를 "study"로 대치
a.replace(2, 11, "study"); //a = "I study C++"
문자열 길이
: 문자열에 포함된 문자 개수, length()와 size() 함수는 문자열의 길이를 리턴한다
길이와는 달리 string 객체의 내부 메모리 용량을 리턴하는 capacity()도 있다.
용량은 자동으로 조절되어 개발자가 신경쓰지는 않아도 된다.
string a("I study C++");
int length = a.length; // "I study C++"의 문자 개수는 11이다. length = 11;
int size = a.size(); //length()와 동일하게 작동. size = 11;
int capacity = a.capacity(); //스트링 a의 현재 용량 capacity = 31; 변할 수 있음
문자열 삭제
erase()는 문자열의 일부를 삭제, clear는 완전히 삭제
string a("I love C++");
a.erase(0, 7); //a의 처음부터 7개의 문자 삭제. a = "C++"로 변경
a.clear(); // a = ""
서브스트링
substr()함수를 사용하면 문자열에서 일부분을 발췌한 문자열(서브스트링)을 얻을 수 있다.
string b = "I love C++";
string c = b.substr(2,4); // b의 인덱스 2에서 4개의 문자 리턴. c = "lvoe"
string d = b.substr(2); //b의 인덱스 2에서 끝까지 문자열 리턴. d = "love C++"
문자열 검색
문자열 내에 특정 문자열이 존재하는지 검색하는 기능이 많은 응용에서 사용
find()는 문자열에서 특정 문자나 문자열을 발견하면 첫 번째 인덱스를 리턴한다.
발견하지 못하면 -1을 리턴
string e = "I love love C++";
int index = e.find("love"); //e에서 "love"검색. 인덱스 2리턴
index = e.find("love", index+1); //e의 인덱스 3부터 "love"검색. 인덱스 7리턴
index = e.find("C#"); //e에서 "C#"을 발견할 수 없음. -1리턴
index = e.find('v', 7); //e의 인덱스 7부터 'v'문자 검색. 인덱스 9리턴
문자열의 각 문자 다루기
at()함수와 [ ] 연산자는 둘 다 문자열의 특정 위치에 있는 문자를 리턴한다.
at()와 [ ] 연산자를 통해 특정 문자를 다른 문자로 수정할 수 있다.
string f("I love C++");
char ch1 = f.at(7); //문자열 f의 인덱스 7에 있는 문자 리턴. ch1 = 'C'
char ch2 = f[7]; // f.at(7)과 동일한 표현. ch2 = 'C'
f[] = 'D'; // f는 "I love D++"
문자열 f의 마지막 문자는 다음과 같다.
char ch = f.at(f.length()-1); //ch은 '+'
문자열의 숫자 변환, stoi()
C++11 표준부터는 문자열을 숫자로 변환하는 전역 함수 stoi()를 추가.
String year = "2014";
int n = stoi(year); //n은 정수 2014값을 가짐
// int n = atoi(year.c_str()); //비주얼 C++ 2008이하
문자 다루기
string은 문자열만 다룰뿐, 문자에 대한 기능은 없다
문자를 다루는 함수는 <locale> 헤더 파일에 존재한다
string a = "hello";
for(int i=0; i<a.length(); i++) a[i] = toupper(a[i]); //a가 "HELLO"로 변경
cout << a' // "HELLO"출력
if(isdigit(a[0]))cout<<"숫자";
else if(isalpha(a.at(0))) cout << "문자"; //a[0]은 문자 'H'
대충 설명도 없이 예시만 덩그러니 던져놔서 따로 공부했다.
https://veganwithbacon.tistory.com/252
https://veganwithbacon.tistory.com/253
https://veganwithbacon.tistory.com/255
'Language & Framework & GIT > C++' 카테고리의 다른 글
[씨앤씨뿔] C++ Template VS Java Generic? (4) | 2023.06.20 |
---|---|
[C++] 스마트 포인터 (3) | 2023.05.03 |
[씨앤씨뿔] isalpha 함수 : <locale> - 3 (1) | 2023.04.28 |
[씨앤씨뿔] isdigit 함수 : <locale> - 2 (0) | 2023.04.27 |
[씨앤씨뿔] toupper & tolower함수 : <locale> -1 (0) | 2023.04.27 |
댓글