반응형
string의 compare 함수는 두 문자열을 사전식(lexicographical)으로 비교하는 멤버 함수입니다.
즉, 사전 순서 기준으로 "작다/크다/같다"를 판단합니다.
// 1) 문자열 전체 비교
int compare(const std::string& str) const;
// 2) 부분 문자열과 비교
int compare(size_t pos, size_t count, const std::string& str) const;
// 3) 부분 문자열끼리 비교
int compare(size_t pos, size_t count,
const std::string& str, size_t pos2, size_t count2) const;
// 4) C 문자열과 비교
int compare(const char* s) const;
// 5) C 문자열 일부와 비교
int compare(size_t pos, size_t count, const char* s) const;
int compare(size_t pos, size_t count, const char* s, size_t count2) const;
반환값 의미
- 0 → 두 문자열이 같음
- < 0 → *this 문자열이 작음 (사전순 앞)
- > 0 → *this 문자열이 큼 (사전순 뒤)
내부적으로는 strcmp와 같은 방식으로 동작한다고 보면 됩니다.
즉, 비교 도중 첫 번째로 다른 문자의 ASCII/유니코드 코드 값 차이를 반환.
기본 예제
#include <iostream>
#include <string>
using namespace std;
int main() {
string a = "Apple";
string b = "Banana";
string c = "Apple";
cout << a.compare(b) << endl; // 음수 (Apple < Banana)
cout << b.compare(a) << endl; // 양수 (Banana > Apple)
cout << a.compare(c) << endl; // 0 (같음)
}
부분 비교 예제
string s = "Hello World";
cout << s.compare(0, 5, "Hello") << endl; // 0 (앞 5글자가 "Hello")
cout << s.compare(6, 5, "World") << endl; // 0 (6번째부터 5글자가 "World")
cout << s.compare(0, 5, "Hellp") << endl; // 음수 ('o' < 'p')
부분 문자열 끼리 비교 예제
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = "HelloWorld";
string s2 = "WorldHello";
// s1의 "Hello"(0~4)와 s2의 "World"(0~4) 비교
cout << s1.compare(0, 5, s2, 0, 5) << endl; // "Hello" vs "World"
// s1의 "World"(5~9)와 s2의 "World"(0~4) 비교
cout << s1.compare(5, 5, s2, 0, 5) << endl; // "World" vs "World"
// s1의 "Hello"(0~4)와 s2의 "Hello"(5~9) 비교
cout << s1.compare(0, 5, s2, 5, 5) << endl; // "Hello" vs "Hello"
}
주의 사항
만약 비교하는 문자열 안에 대소문자가 섞여 있다면 제대로 된 결과가 나오지 않는다.
compare는 대소문자 구분(case-sensitive) 비교만 하기 때문에,
사람이 생각하는 “사전 순서(Apple < banana < Zoo)”와 다른 결과가 나올 수 있다.
- compare는 문자 코드(ASCII/유니코드)만 단순 비교
- ASCII에서는 대문자 'A'~'Z'(65~90)가 소문자 'a'~'z'(97~122)보다 항상 작음
- 따라서 "Zoo" < "apple"이라는 직관과 어긋나는 결과가 발생
string s1 = "Apple";
string s2 = "banana";
string s3 = "Zoo";
cout << s1.compare(s2) << endl; // -1 ("Apple" < "banana", 코드값 기준 'A'=65 vs 'b'=98)
cout << s2.compare(s3) << endl; // 1 ("banana" > "Zoo", 코드값 기준 'b'=98 vs 'Z'=90)
- 사람 기준: Apple < banana < Zoo
- C++ compare 기준: Apple < Zoo < banana
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
| C++ 람다함수 기본편 (0) | 2025.10.31 |
|---|---|
| C++ struct와 class의 차이 (0) | 2025.10.04 |
| C++ string 주요 멤버 함수 (0) | 2025.10.01 |
| C++ <iomanip> 포맷 제어 도구 (0) | 2025.10.01 |
| C++ ostringstream string 버퍼를 이용한 출력 (0) | 2025.10.01 |
댓글