C++ 문자열 마스터하기: C-스타일 vs std::string
C++은 다음과 두 가지 문자열 표현 방식을 제공합니다.
- C-스타일 문자열
- 표준 C++과 함께 도입된 string 클래스 타입
C-스타일 문자열
C-스타일 문자열은 C 언어에서 유래했으며 C++에서도 계속 지원됩니다. 이 문자열은 실제로는 null 문자 '\0'로 끝나는 1차원 문자 배열입니다. 따라서 null-종료 문자열은 문자열을 구성하는 문자들에 이어 null 문자가 뒤따릅니다.
다음 선언과 초기화는 "Hello"라는 단어로 이루어진 문자열을 생성합니다. 배열 끝에 null 문자를 담기 위해, 문자열을 담는 문자 배열의 크기는 "Hello"의 문자 수보다 하나 더 큽니다.
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
배열 초기화 규칙을 따르면 위 문장을 다음과 같이 쓸 수도 있습니다.
char greeting[] = "Hello";
위에서 정의한 문자열의 C/C++ 메모리 표현:
사실 문자열 상수 끝에 null 문자를 직접 둘 필요는 없습니다. C++ 컴파일러가 배열을 초기화할 때 자동으로 '\0'을 끝에 배치합니다. 위 문자열을 출력해 보겠습니다.
Live Demo
#include <iostream>
using namespace std;
int main () {
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
return 0;
}
위 코드를 컴파일하고 실행하면:
Greeting message: Hello
C++은 null-종료 문자열을 조작하는 다양한 함수를 지원합니다.
| 번호 | 함수 및 목적 |
| 1 | strcpy(s1, s2); 문자열 s2를 s1에 복사합니다. |
| 2 | strcat(s1, s2); 문자열 s2를 s1 끝에 연결합니다. |
| 3 | strlen(s1); 문자열 s1의 길이를 반환합니다. |
| 4 | strcmp(s1, s2); s1과 s2가 같으면 0, s1<s2면 0 미만, s1>s2면 0 초과 반환 |
| 5 | strchr(s1, ch); 문자열 s1에서 문자 ch의 첫 번째 출현 위치를 가리키는 포인터 반환 |
| 6 | strstr(s1, s2); 문자열 s1에서 문자열 s2의 첫 번째 출현 위치를 가리키는 포인터 반환 |
위 함수들 중 몇 가지를 사용하는 예제:
Live Demo
#include <iostream>
#include <cstring>
using namespace std;
int main () {
char str1[10] = "Hello";
char str2[10] = "World";
char str3[10];
int len;
// str1을 str3에 복사
strcpy(str3, str1);
cout << "strcpy(str3, str1) : " << str3 << endl;
// str1과 str2 연결
strcat(str1, str2);
cout << "strcat(str1, str2): " << str1 << endl;
// 연결 후 str1 전체 길이
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
위 코드를 컴파일하고 실행하면:
strcpy(str3, str1) : Hello
strcat(str1, str2): HelloWorld
strlen(str1) : 10
C++의 string 클래스
표준 C++ 라이브러리는 위에서 언급한 모든 연산을 지원하며, 추가로 훨씬 더 많은 기능을 제공하는 string 클래스 타입을 제공합니다. 다음 예제를 확인해 보세요.
Live Demo
#include <iostream>
#include <string>
using namespace std;
int main () {
string str1 = "Hello";
string str2 = "World";
string str3;
int len;
// str1을 str3에 복사
str3 = str1;
cout << "str3 : " << str3 << endl;
// str1과 str2 연결
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 연결 후 str3 전체 길이
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
위 코드를 컴파일하고 실행하면:
str3 : Hello
str1 + str2 : HelloWorld
str3.size() : 10