[C++]13 C++ 문자열 비교 하는 라이브러리 사용하기(strcmp,strncmp)
안녕하세요 고급개발자가 꿈인 코린이 입니다.
오늘은 c++에서 문자열 비교하는 방법에 대해서 포스팅 하겠습니다.
c++에서 문자열 비교하는 방법에는 strcmp 와 strncmp가 있는데요 이 두개의 차이점과
각 리턴하는 값들의 차이점에 대해서 설명 하도록 하겠습니다.
strcmp는 아래와 같이 인자를 두개를 넣을수 있습니다.
#include <string.h>
int strcmp(const char *string1, const char *string2);
이와 다르게 strncmp는 인자를 3개 넣을수 있죠
#include <string.h>
int strncmp(const char *string1, const char *string2, size_t count);
strcmp와의 차이점으로는 count라는 인자를 하나 더넣을수있는데 그 차이점은
strncmp는 처음부터 count까지의 문자를 비교를 한 후에 결과값을 리턴해주고
strcmp는 각 매개변수로 넣어준 인자 두개자체를 비교해서 결과 값을 리턴해 줍니다.
얼핏 생각하면 이러면 같은 결과 값이 나오는 것이 아닌가라고 생각이 들수가 있는데
이 결과 값에 대한 차이점을 아래 코드로 설명 드리겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include "ServiceClass.h"
#include <string.h>
ServiceClass::ServiceClass()
{
const char * str1 = "Hello world";
const char * str2 = "Hello world";
function_Strcmp(str1,str2);
function_Strncmp(str1,str2);
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::function_Strcmp(const char *str1, const char *str2)
{
std::cout << "function_Strcmp called str1: " << str1 << " str2: " << str2 << std::endl;
int returnValue = strcmp(str1,str2);//strcmp 문자열 비교 함수를 호출 후 리턴 값을 변수에 넣어준다.
if(returnValue == 0){//리턴값이 0일때
std::cout << "######## str1 str2 은 같은문자" << std::endl;
}else if(strcmp(str1,str2) < 0){//리턴값이 0보다 작을때
std::cout << "######## str1 str2 은 다른 문자 st1의 문자 개수가 작음" << std::endl;
}else{//리턴값이 0보다 클때
std::cout << "######## str1 str2 은 다른 문자 st2의 문자 개수가 작음" << std::endl;
}
}
void ServiceClass::function_Strncmp(const char *str1, const char *str2)
{
std::cout << "function_Strncmp called str1: " << str1 << " str2: " << str2 << std::endl;
int returnValue = strncmp(str1,str2,5);//strcmp 문자열 비교 함수를 호출 후 리턴 값을 변수에 넣어준다. 5글자까지만 비교
if(returnValue == 0){//리턴값이 0일때
std::cout << "@@@@@@@@ str1 str2 은 같은문자" << std::endl;
}else if(returnValue < 0){//리턴값이 0보다 작을때
std::cout << "@@@@@@@@ str1 str2 은 다른 문자 st1의 문자 개수가 작음" << std::endl;
}else{//리턴값이 0보다 클때
std::cout << "@@@@@@@@ str1 str2 is 은 다른 문자 st2의 문자 개수가 작음" << std::endl;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 코드를 보겠습니다.
하나는 strcmp를 돌리는 함수이고 하나는 strncmp를 돌리는 함수 입니다.
strncmp의 count인자에는 5를 넣어주었습니다.
위에처럼 str1 과 str2의 값이 같은 문자열을 비교했을때는 strcmp도 0을 리턴하고 strncmp도 0을 리턴합니다.
여기서 차이점은 strncmp는 5자리까지의 문자만 비교가되어서 "Hello"까지만 비교 후 같다는 것을 리턴하기 위해
0을 리턴하는 것이고 strcmp는 "Hello world" 11자리 모두를 비교 하고 같기때문에 0을 리턴해준 것 입니다.
그렇다면 위의 str1변수의 글자와 str2변수의 글자가 서로 다르다면 어떻게 될까요??
이번에는 서로 다르지만 5번째 글자 이후에 글자가 다를때를 보여드리겠습니다.
보기 쉽게 설명하기위해서 str1변수와 str2변수에 무엇을 넣었고 어떻게 결과 값이 나오는지를 보겠습니다.
1. str1 과 str2의 글자가 앞 5자리 까지만 같을때(str1변수의 글자가 더 작을때)
str1:Hello
str2:Hello world
2. str1 과 str2의 글자가 앞 5자리 까지만 같을때(str2변수의 글자가 더 작을때)
str1:Hello world
str2:Hello
3. str1 과 str2의 글자가 앞 5자리 영역안에서 다를때(str1변수의 글자가 더 작을때)
str1:Hell
str2:Hello
4. str1 과 str2의 글자가 앞 5자리 영역안에서 다를때(str1변수의 글자가 더 작을때)
str1:Hello
str2:Hell
위의 실행결과를 보면 차이점이 확연히 들어나죠??
strncmp는 글자가 길어도 count까지의 문자만 비교해서 같으면 0을 리턴 하고 strcmp는 두 글자가 완전히
같을때만 0을 리턴합니다. 그리고 st1문자의 길이가 더 작으면서 글자가 다를때는 0보다 작은 값을
st2문자의 길이가 더 작으면서 글자가 다를때는 0보다 큰값을 리턴하게 됩니다.
그리고 이 strncmp와 strcmp를 쓸때 가장 중요한 내용이 있습니다.
이 strcmp와 strncmp는 null을 비교하게 되면 프로그램이 종료 즉 앱이 죽게 됩니다.
그렇기 때문에 매개변수로 받아오거나 다른 앱에서 받아서 비교하는 경우에는 필히 null체크를 하셔야
앱이 죽는것을 방지할수가 있습니다. 꼭 기억해 두시기 바랍니다.!!
그리고 아래와 같이 str2를 기준으로 문자비교를 하고 싶을때는 꼭 str2의 문자 길이를 파악하는 c라이브러리인
strlen을 사용해서 처리를 해주면 더욱 좋은 코드가 될수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void ServiceClass::function_Strncmp(const char *str1, const char *str2)
{
std::cout << "function_Strncmp called str1: " << str1 << " str2: " << str2 << std::endl;
int returnValue = strncmp(str1,str2,strlen(str2);//strcmp 문자열 비교 함수를 호출 후 리턴 값을 변수에 넣어준다. 5글자까지만 비교
if(returnValue == 0){//리턴값이 0일때
std::cout << "@@@@@@@@ str1 str2 은 같은문자" << std::endl;
}else if(returnValue < 0){//리턴값이 0보다 작을때
std::cout << "@@@@@@@@ str1 str2 은 다른 문자 st1의 문자 개수가 작음" << std::endl;
}else{//리턴값이 0보다 클때
std::cout << "@@@@@@@@ str1 str2 is 은 다른 문자 st2의 문자 개수가 작음" << std::endl;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
여기까지 c++에서 문자열 비교하는 내용을 다루어 보았습니다.
읽어주셔서 감사합니다.!!
'C++ > C++심화' 카테고리의 다른 글
[C++]15 C++ 뒤에서 부터 특정 문자를 찾아서 그 문자부터 문자열 출력하기 (strrchr,memchr) (0) | 2019.11.24 |
---|---|
[C++]14 C++ 문자열 길이 파악하는 라이브러리 사용하기(strlen,strnlen) (0) | 2019.11.03 |
[C++]12. C++ 소스코드에서 linux 명령어 실행 하는 방법 (0) | 2019.10.20 |
[C++]11. 프로세스와 스레드(멀티 프로세싱? 멀티 스레드?) (0) | 2019.09.29 |
[C++]10. vector 사용하기(구조체 vector중간 원소 삭제하기,특정원소 삭제하기) (0) | 2019.09.04 |