문자열(string)이란
메모리에 저장된 일련의 연속된 문자(character)들의 집합입니다.
C++에서는 문자열을 두 가지 방법으로 생성할 수 있습니다.
1. C언어 스타일의 문자열
2. string 클래스를 이용한 문자열
C언어 스타일의 문자열
C++에서는 " "를 사용해 표현되는 문자열을 문자열 상수라고 합니다.
상수라고 표현하는 이유는 해당 문자열이 이름을 가지고 있지 않으며, 문자열의 내용 또한 변경할 수 없기 때문입니다.
C++에서 문자형 배열을 선언하면 곧 문자열 변수가 됩니다.
🥑 C++에서는 문자열의 길이에 제한을 두지 않습니다.
| 널(NULL) 문자
문자열의 끝을 의미하는 문자를 하나 더 삽입합니다.
'\0'로 표시하고, ASCII code로는 0입니다.
** 널 문자의 유무로 문자형 데이터 배열과 실제 문자열을 서로 구분할 수 있습니다.
🥑 문자열을 저장하기 위한 문자형 배열을 선언할 때에는 반드시 널 문자까지 포함해서 생각해야 합니다
| 문자열 입력
const int SIZE = 20;
char address[SIZE];
char name[SIZE];
// ********************
// cin : 띄어쓰기 미포함
// ********************
cout << "자신의 이름을 적어주세요 : ";
cin >> name;
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin >> address;
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
이 예제는 다음과 같은 두 가지 문제점을 안고 있습니다.
1. 이름에 띄어쓰기가 들어가면 도시명을 입력할 수 없습니다.
2. 20바이트 이상의 이름이나 도시명을 입력하면 프로그램이 강제 종료됩니다
C++에서 cin 객체는 띄어쓰기를 포함한 탭 문자, 캐리지 리턴 문자 등을 모두 문자열의 끝으로 인식합니다.
따라서 띄어쓰기를 포함한 문자열을 전부 입력받으려면 cin 객체의 get() 메소드를 사용하여 다음처럼 수정해야 합니다.
const int SIZE = 20;
char address[SIZE];
char name[SIZE];
// ********************
// get() : 띄어쓰기 포함
// ********************
cout << "자신의 이름을 적어주세요 : ";
cin.get(name, SIZE).get();
// ********************
// ignore() : 한정된 바이트 이상으로 입력 받을 수 있음
// ********************
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin.get(address, SIZE).ignore(SIZE, '\n');
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
하지만
C++에서 제공하는 string 클래스의 getline( )을 이용하면 간단합니다.
** 문자열의 띄어쓰기 문제나 문자열의 길이와 상관없이 모든 문자열을 정확히 입력받을 수 있습니다.
#include <iostream>
#include <string>
using namespace std;
int main(void){
string address, name;
cout << "자신의 이름을 적어주세요 : ";
getline(cin, name);
cout << "자신이 살고 있는 도시를 적어주세요 : ";
getline(cin, address);
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
return 0;
}
| C언어 문자열 처리 함수 종류
string 클래스를 이용한 문자열
string 클래스는 문자형 배열보다 사용하기 편리하며, 문자열을 하나의 타입처럼 표현할 수 있게 해줍니다.
string str1; // 길이가 0인 문자열의 선언
str1 = "C++ Programming"; // 문자열의 초기화
string str2 = "C++"; // 문자열의 선언과 동시에 초기화
string 객체는 위와 같이 문자열을 배열 형태가 아닌 단순한 변수로 선언합니다.
문자열의 길이에 대한 문제는 C++ 프로그램이 자동으로 처리해 줍니다.
string dog = "Navi";
cout << "현재 dog 변수의 길이는 " << dog.length() << "입니다." << endl;
cout << "강아지 이름의 첫 글자는 바로 " << dog[0] << "입니다.";
string 객체로 만든 문자열도 인덱스로 다룰 수 있습니다.
| 문자열 처리
string str1 = "C++ is Cool!";
string str2;
str2 = str1; // 문자열 대입 연산
str2 출력 >> C++ is Cool!
string 객체를 이용하면 복합 대입 연산자(+=)나 append( ) 메소드를 이용하여 손쉽게 추가나 결합을 할 수 있습니다.
🥑 이때 append( )메소드는 '문'일 때는 불가능하고, "문자열"일 때만 가능합니다.
'문'이나 '자' 등 한 글자를 추가/결합할 경우, 복합 대입 연산자(+=)를 사용해줍니다.
| 문자열 입출력
문자열을 한 행(line)씩 읽고 싶을 때는 getline() 함수를 사용
| string 메소드
string 메소드는 string 클래스에 정의된 문자열과 관련된 작업을 할 때 사용하는 메소드입니다.
string 클래스에서 제공하는 대표적인 문자열 처리 함수는 다음과 같습니다.
1. length( ) 메소드와 size() 메소드
length( ) 문자열의 길이
size( ) 해당 string 객체가 메모리에서 실제 사용하고 있는 크기
두 메소드는 같다고 보면 됩니다.
2. append( ) 메소드
3. find( ) 메소드
문자열을 찾지 못하면, string::size_type의 string::npos라는 상수를 반환
1. 문자열.find(찾을문자열); // 인덱스 0부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.
2. 문자열.find(찾을문자); // 인덱스 0부터 찾을 문자를 찾아, 그 시작 위치를 반환함.
3. 문자열.find(찾을문자열, 시작위치); // 시작 위치부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.
string str = "C++ Programming";
cout << str.find("Pro") << endl;
cout << str.find('r') << endl;
if (str.find("Pro", 5) != string::npos){
cout << "해당 문자열을 찾았습니다.";
}else{
cout << "해당 문자열을 찾지 못했습니다.";
}
🥑 정적 상수인 string::npos는 string 클래스에 static const size_type= -1 로 명시되어 있습니다.
4. compare( ) 메소드
이 메소드는 true / false를 반환합니다.
아래 예시는 true를 반환하는 경우입니다.
str1.compare(str_02) == 0 // str1과 str2이 같을 경우
str1.compare(str_02) < 0 // str1이 str2보다 사전 편찬순으로 앞에 있을 경우
str1.compare(str_02) > 0 // str1이 str2보다 사전 편찬순으로 뒤에 있을 경우
5. replace( ) 메소드
6. capacity( ) 메소드와 max_size( ) 메소드
7. at( index )
해당 위치( index )에 해당하는 문자를 반환합니다.
str1.at(0); //"BlockDMask" -> 'B'를 리턴합니다.
8. insert( )
basic_string& insert(size_type index, size_type count, CharT ch);
basic_string& insert(size_type index, const CharT* s);
basic_string& insert(size_type index, const CharT* s, size_type count);
basic_string& insert(size_type index, const basic_string& str);
basic_string& insert(size_type index, const basic_string& str,
size_type index_str, size_type count = npos);
문자를 숫자로 변환하기
string -> char로 잘라서 출력하기
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(){
string S = "12345";
char tempS;
for(int i = 0; i < S.size(); i++){
tempS = S.at(i);
cout << tempS << ' ';
}
return 0;
}
string -> char[ ] 배열에 잘라서 출력하기
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(){
string S = "12345";
char tempS[30];
for(int i = 0; i < S.size(); i++){
tempS[i] = S.at(i);
cout << tempS[i] << ' ';
}
return 0;
}
< 문자 -> 숫자 >
string을 하나씩 char[ ]에 담은 뒤, - '0'을 해주기
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(){
string S = "12345";
char tempS[30];
int tempN;
for(int i = 0; i < S.size(); i++){
tempS[i] = S.at(i);
tempN = tempS[i] - '0';
cout << tempN;
}
return 0;
}
< 숫자 -> 문자 >
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(){
int S = 1;
char tempS;
for(int i = 0; i < 5; i++){
tempS = S + '0';
}
cout << tempS;
return 0;
}
reference
'OLD_알고리즘' 카테고리의 다른 글
Solving Skill ] 해시 맵(Hash Map) (0) | 2021.01.22 |
---|---|
Solving Skill ] Greedy (0) | 2021.01.17 |
STL ] Stack (0) | 2021.01.03 |
STL ] vector - 타 블로그 참고 (0) | 2021.01.03 |
c의 getline()과 c++의 getline() (0) | 2020.11.30 |
댓글