C++의 String Compare 함수 C의 strcmp 함수 이 두 함수는 문자열을 비교해주는 함수입니다
string compare 의 반환값은 같으면 0 다르면 ascii 코드의 차이값을 반환하고
strcmp 의 반환값은 같으면 0 다르면 1 또는 -1을 반환하게 됩니다.
(반환값은 운영체제 별로 다를 수 있습니다)
어찌 되었건 두 함수의 용도는 문자열 비교인데요
그런데 두 함수의 결정적인 차이는 비교하는 자료형에서 차이가 나게 됩니다
#include <iostream>
#include <string>
int main()
{
std::string hello = "hell";
std::string hello1 = "hella!";
std::size_t len = hello1.length();
hello1[len - 1] = '\0';
hello1[len - 2] = '\0';
char *h = strdup("hell");
char *h1 = strdup("hella!");
len = std::strlen(h1);
h1[len - 1] = '\0';
h1[len - 2] = '\0';
std::cout << "--------------c++--------------\n";
std::cout << "string compare : " << hello.compare(hello1) << std::endl;
std::cout << "str1 : " + hello << std::endl;
std::cout << "str2 : " + hello1 << std::endl;
std::cout << "str1 length : " << hello.length() << std::endl;
std::cout << "str2 length : " << hello1.length() << std::endl;
std::cout << "--------------c----------------\n";
std::cout << "c strcmp : " << std::strcmp(h, h1) << std::endl;
std::cout << "str1 : " << h << std::endl;
std::cout << "str2 : " << h1 << std::endl;
std::cout << "str1 length : " << std::strlen(h) << std::endl;
std::cout << "str2 length : " << std::strlen(h1) << std::endl;
}
// 실행결과
/*
--------------c++--------------
string compare : -1
str1 : hell
str2 : hell
str1 length : 4
str2 length : 6
--------------c----------------
c strcmp : 0
str1 : hell
str2 : hell
str1 length : 4
str2 length : 4
*/
hello1의 마지막 두 문자를 널 문자로 바꿔서 네개의 변수 모두 같은 값을 가지게 했습니다
string compare의 경우 -1을 반환하고 strcmp의 경우 0을 반환한것을 보실 수 있습니다.
string은 내부적으로 저장되어 있는 문자열의 길이를 따로 측정해서 compare에 사용합니다
하지만 strcmp는 char * 의 마지막 즉 널 문자('/0') 전 까지만 확인하기 때문에 결과값이 차이가 나게 됩니다
두 함수 모두 strlen(), string.size() 를 사용하게 되는데 이 부분에서 문자열 길이에 차이가 나기 때문에 결과값이 다른거죠
string compare 코드
template<class CharT, class Traits, class Alloc>
int std::basic_string<CharT, Traits, Alloc>::compare
(const std::basic_string& s) const noexcept
{
size_type lhs_sz = size();
size_type rhs_sz = s.size();
int result = traits_type::compare(data(), s.data(), std::min(lhs_sz, rhs_sz));
if (result != 0)
return result;
if (lhs_sz < rhs_sz)
return -1;
if (lhs_sz > rhs_sz)
return 1;
return 0;
}
참고한 레퍼런스 https://en.cppreference.com/w/cpp/string/basic_string/compare
공식 레퍼런스에 있는 코드입니다
보시면 두 문자열의 길이를 뽑아올 때 size 함수를 사용하기 때문에 c와 다른 결과값인 -1이 반환 되는것 입니다.
따라서 strcmp와 string compare는 같은 용도로 사용하지만 좀 더 정확한 측정 방식은 string compare가 되겠습니다.
'C++' 카테고리의 다른 글
[C++] Flatbuffer 사용법 (0) | 2024.11.13 |
---|---|
[C++] Inline함수와 #Define 차이점 (0) | 2024.11.01 |
[C++] IOCP OverlappedEx 구조체에 관하여 (0) | 2024.10.21 |
[C++] find_if 로 특정 클래스 가져오기 (0) | 2024.07.13 |
[C++] Html Form 인코딩된 데이터 디코딩하기 (0) | 2023.07.05 |