A. C++ 문자열 개요
1. C++ 문자열
a. C++ 문자열이란?
🌟 메모리에 저장된 일련의 연속된 문자(character)들의 집합
💙 c++에서는 2가지 스타일로 생성 가능
1. c언어 스타일의 문자열
2. string 클래스를 이용한 문자열
2. C언어 스타일의 문자열
a. C 스타일의 문자열 선언
문자열 상수(string constant) : 큰따옴표("")를 사용해 표현되는 문자열
👉 상수인 이유는 이름 X, 내용 변경 X
⏳ 예제
const int SIZE = 20;
char address[SIZE] = "hello"; //보이지 않지만 끝에 0 이 있음
b. C스타일의 문자열 특징
- 문자형 배열을 선언하면 이 배열이 곧 문자열 변수가 됨
- C언어 스타일의 문자열 입력에서는 입력할 문자열의 길이를 미리 알고 있어야만 함
- C++에서는 문자열의 길이에 제한 X
c. NULL 문자
🌟 문자열이 끝나면 끝을 의미하는 문자( 널(NULL) 문자, '\0'으로 표시)를 하나 더 삽입
null 문자는 아스키코드 값도 0
널 문자의 유무로 문자형 데이터 배열과 실제 문자열을 서로 구분
d. C스타일의 문자열 입출력
1) 문자열을 입력받기 위해서는 문자열이 저장될 문자형 배열을 미리 생성해야 함
2) cin 객체는 띄어쓰기, 탭 문자, 캐리지 리턴 문자를 모두 문자열의 끝으로 인식
👉 cin 객체의 get() 메소드를 이용해 문자열의 끝을 잘 인식할 수 있게 함
3) 길이는 cin 객체의 ignore() 메소드를 사용
⏳ 예제 : 띄어쓰기와 문자열 길이를 처리
const int SIZE = 20;
char address[SIZE]; //1)
char name[SIZE];
cout << "자신의 이름을 적어주세요 : ";
cin.get(name, SIZE).ignore(SIZE, '\n'); //2), 3)
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin.get(address, SIZE).ignore(SIZE, '\n'); //2), 3)
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
✨ 실행결과
자신의 이름을 적어주세요 : abcdefghijklmnopqrstuvwxyz
자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRS에 살고 있는 abcdefghijklmnopqrs님~ 감사합니다!
e. string 클래스를 이용한 문자열 입출력
C++에서는 string 클래스를 이용해 위 코드를 단순하게 사용 가능
문자열의 띄어쓰기 문제나 문자열의 길이와 상관없이 모든 문자열을 정확히 입력받을 수 있음
⏳ 예제 : C++ 스타일의 string을 활용
#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;
}
✨ 실행결과
자신의 이름을 적어주세요 : 가나다라마바사아자차카타파하
자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ에 살고 있는 가나다라마바사아자차카타파하님~ 감사합니다!
f. C언어 문자열 처리 함수
C++에서는 C스타일 문자열을 처리하기 위해 C라이브러리 문자열 처리 함수를 이용
👇 사용할 수 있는 함수는 아래에서 확인
B. String 기초
1. string 클래스
a. string 클래스란?
🌟 문자열을 하나의 타입처럼 표현할 수 있게 해줌 (문자형 배열보다 사용하기 편리)
사용하기 전 string 헤더 파일을 포함해야 함
string 클래스는 std 네임스페이스에 포함되어 using 지시자나 해당 네임스페이스를 참조해야 함
b. 선언 및 초기화
📘 string 객체를 사용한 문자열 선언
string str1; // 문자열의 선언
str1 = "C++ Programming"; // 문자열의 초기화
string str2 = "C++"; // 문자열의 선언과 동시에 초기화
c. string 객체의 특징
- 배열의 형태가 아닌 단순한 변수로 선언
- 길이 명시 X, 길이에 대한 문제는 C++ 프로그램이 자동으로 처리
- 선언시 길이는 0, 초기화하면 자동으로 조절 = 편하고 안전하게 문자열 처리 가능
- 인덱스로 다룰 수 있음
⏳ 예제 : 길이를 자동 조절
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string dog;
cout << "현재 dog 변수의 길이는 " << dog.length() << "입니다." << endl;
dog = "Navi";
cout << dog << "! 정말 이쁜 이름이네요!" << endl;
cout << "현재 dog 변수의 길이는 " << dog.length() << "입니다." << endl;
cout << "강아지 이름의 첫 글자는 바로 " << dog[0] << "입니다.";
return 0;
}
✨ 실행결과
현재 dog 변수의 길이는 0입니다.
Navi! 정말 이쁜 이름이네요!
현재 dog 변수의 길이는 4입니다.
강아지 이름의 첫 글자는 바로 N입니다.
💥 만일 강아지 이름이 한글이라면 한글은 2byte로 취급되기 때문에 제대로 출력되지 않음
c. 문자열 처리
1) 대입
strcpy()나 strncpy() 사용할 필요 없이 = 사용
2) 추가 / 결합
strcat() / strncat() 사용할 필요 없이 =+ / append() 메소드 사용
⏳ 예제 : 복사, 결합
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str0 = "Hello";
string str1;
string str2 = "World";
string str3;
str1 = str0 ; //문자열 대입 연산
str3 = str1 + str2; // 문자열 결합 연산
str1 += str2; // 문자열 추가 연산
cout << str3 << endl;
cout << str1;
return 0;
}
✨ 실행결과
HelloWorld
HelloWorld
d. 문자열 입출력
입력에는 cin 객체를, 출력에는 cout 객체를 사용
한 단어 단위로 수행하기 때문에 한 행씩 읽고 싶으면 getline()함수 사용
📘 문법
getline(cin 객체, 저장할 string 변수);
⏳ 예제 : getline() 함수
string name, subject;
cout << "자신의 이름을 적어주세요 : ";
getline(cin, name);
cout << "가장 자신있는 과목을 적어주세요 : ";
getline(cin, subject);
cout << name << "님이 가장 자신있어 하는 과목은 바로 " << subject << "입니다!";
✨ 실행결과
자신의 이름을 적어주세요 : 홍길동
가장 자신있는 과목을 적어주세요 : 국어
홍길동님이 가장 자신있어 하는 과목은 바로 국어입니다!
2. string 메소드
a. string 메소드
🌟 string 클래스에 정의된 문자열과 관련된 작업을 할 때 사용하는 메소드
아래는 대표적인 문자열 처리 함수를 정리
b. length() 메소드와 size() 메소드
🌟 문자열의 길이를 반환하는 메소드
둘이 같은 값을 반환하지만, length()는 문자열의 길이 / size()는 메모리의 실제 사용 크기를 의미함
⏳ 예제 : length() 메소드와 size() 메소드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str1;
string str2 = "C++ Programming";
cout << "문자열 str1의 길이는 " << str1.length() << "입니다." << endl; //0
cout << "문자열 str2의 길이는 " << str2.size() << "입니다."; //15
return 0;
}
c. append() 메소드
🌟 하나의 문자열의 끝에 다른 문자열을 추가하는 메소드
📘 문법
1. 문자열.append(추가할문자열); // 추가할 문자열을 맨 끝에 추가함.
2. 문자열.append(추가할문자열, 시작위치, 개수); // 추가할 문자열의 시작 위치부터 개수만큼만 맨 끝에 추가함.
3. 문자열.append(개수, 추가할문자); // 추가할 문자를 개수만큼 맨 끝에 추가함
⏳ 예제 : append() 메소드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str1, str2, str3;
str1.append("C++ Programming");
str2.append("C++ Programming", 4, 7);
str3.append(4, 'X');
cout << str1 << endl; //C++ Programming
cout << str2 << endl; //Program
cout << str3; //XXXX
return 0;
}
d. find() 메소드
🌟 특정 문자열을 찾아, 그 시작 위치를 반환하는 메소드
찾을 문자열을 찾지 못하면, string::size_type의 string::npos라는 상수를 반환
👉 정적 상수인 string::npos는 string 클래스에 static const size_type= -1 로 명시
📘 문법
1. 문자열.find(찾을문자열); // 인덱스 0부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.
2. 문자열.find(찾을문자); // 인덱스 0부터 찾을 문자를 찾아, 그 시작 위치를 반환함.
3. 문자열.find(찾을문자열, 시작위치); // 시작 위치부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.
⏳ 예제 : find() 메소드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str = "C++ Programming";
cout << str.find("Pro") << endl; //4
cout << str.find('r') << endl; //5
if (str.find("Pro", 5) != string::npos)
{
cout << "해당 문자열을 찾았습니다.";
}
else
{
cout << "해당 문자열을 찾지 못했습니다."; //출력
}
return 0;
}
e. conpare() 메소드
🌟 두 문자열 간의 내용을 비교하는 메소드
📘 compart() 메소드의 반환값이 참(true)이 되는 경우
1. str1.compare(str_02) == 0 // str1과 str2이 같을 경우
2. str1.compare(str_02) < 0 // str1이 str2보다 사전 편찬순으로 앞에 있을 경우
3. str1.compare(str_02) > 0 // str1이 str2보다 사전 편찬순으로 뒤에 있을 경우
⏳ 예제 : compare() 메소드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str1 = "ABC";
string str2 = "ABD";
if (str1.compare(str2) == 0)
{
cout << str1 << "가(이) " << str2 << "와 같습니다.";
}
else if (str1.compare(str2) < 0)
{
cout << str1 << "가(이) " << str2 << "보다 사전 편찬 순으로 앞에 있습니다."; //출력
}
else
{
cout << str1 << "가(이) " << str2 << "보다 사전 편찬 순으로 뒤에 있습니다.";
}
return 0;
}
f. replace() 메소드
🌟 특정 문자열을 찾아, 그 문자열을 다른 문자열로 대체
📘 문법
문자열.replace(대체할문자열의시작위치, 대체할문자열의길이, 새로운문자열);
// 전달된 시작 위치부터 문자열의 길이만큼을 제거한 후에, 새로운 문자열을 삽입
사용하기 전에 우선 find() 메소드를 사용하여 해당 문자열이 존재하는지를 파악해야 함
⏳ 예제 : replace() 메소드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str1 = "C++ is very nice!";
string str2 = "nice";
string str3 = "awesome";
string::size_type index = str1.find(str2);
if (index != string::npos)
{
str1.replace(index, str2.length(), str3);
}
cout << str1; //C++ is very awesome!
return 0;
}
i. capacity() 메소드
🌟 해당 문자열이 재대입(reallocation)받지 않고 저장할 수 있는 최대 문자열의 길이를 반환
j. max_size 메소드
🌟 해당 문자열이 최대한 대입받으면 가질 수 있는 최대 문자열의 길이를 반환
⏳ 예제
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string str = "C++ programming";
cout << "문자열 str의 length는 " << str.length() << "입니다." << endl; //15
cout << "문자열 str의 capacity는 " << str.capacity() << "입니다." << endl; //15
cout << "문자열 str의 max_size는 " << str.max_size() << "입니다."; //4611686018427387903
return 0;
}
출처 : http://www.tcpschool.com/cpp/cpp_string_cStyle
'프로그래밍 언어 > C++' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 객체지향 : OOP 3대 요소 / 상속성, 은닉성, 다형성 (28, 29, 30강) (0) | 2023.09.11 |
---|---|
[게임 프로그래머 입문 올인원] 객체지향 : 객체지향 개론 (27강) (2) | 2023.09.11 |
[자료형(data type)] C++ 파생형 포인터 총정리 (0) | 2023.09.09 |
[자료형(data type)] C++ 파생형 배열 총정리 (0) | 2023.09.08 |
[게임 프로그래머 입문 올인원] 포인터와 배열 : 문자열, 참조 (22, 23강) (0) | 2023.09.07 |