c언어의 string.h에는 문자열 비교를 위한 strcmp 함수가 있습니다. 이 함수에 대해 알아보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp1.png)
먼저 각 인자들과 리턴 값에 대한 설명은 아래와 같습니다.
- 리턴 값
- str1이 str2보다 사전순으로 앞서면 음수를 돌려줍니다.
- str1이 str2보다 사전순으로 뒤에 있으면 양수를 돌려줍니다.
- 둘 다 같으면 0을 돌려줍니다.
- str1, str2
- 비교할 두 문자열을 의미합니다.
비교할 때 byte 단위로 비교한다는 것을 조심해야 합니다.
보통 문자열 비교를 할 때 예제 1번과 같이 비교하면 안 될까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp2.png)
안 됩니다. str1과 str2가 같은지를 비교하고 있는데요. 문자열의 내용이 같은지를 비교하는 것이 아닙니다. 시작 주소가 같은지를 비교하는 것이지요.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp4.png)
같은가요? 별개의 공간에 위치해 있어요. 따라서, str1 == str2는 false가 되고 No가 출력됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp3.png)
No가 출력됨을 볼 수 있어요. 그래서, c언어에서 문자열을 비교할 때에는 strcmp 함수를 이용해야 합니다. 특히 같은지 검사하려면 strcmp의 리턴값이 0인지를 체크해야 합니다. 기억하기 쉽게 함수 STRing CoMPare로 기억하시면 편합니다.
이 함수가 어떻게 동작할까요? str1은 “ac”이고 str2는 “ab”라고 해 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp5.png)
메모리 상에는 위와 같이 있습니다. 1번째 요소부터 비교해 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp6.png)
str1의 1번째 문자는 ‘a’, 2번째 문자 역시 ‘a’입니다. 같지요? 따라서 2번째 요소로 넘어갑니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp7.png)
str1의 2번째 문자는 ‘b’, str2의 2번째 문자는 ‘c’입니다. 다르네요? 다르다면, 그 차이를 리턴 합니다. 이 경우, str1이 str2보다 사전 순으로 앞서므로, 음수가 돌려질 겁니다. 두 문자가 길이가 다른 경우에는 어떨까요? str1이 “acd”이고 str2가 “ac”인 경우를 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp8.png)
2번째 문자를 비교해 보니, 둘 다 ‘c’로 같지요. 3번째 문자를 비교해 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp9.png)
다르지요? 하나는 ‘d’이지만 다른 하나는 널 문자이기 때문입니다. 길이가 다른 경우, 순회 하는 과정에서 문자가 다른 곳이 생기니 문제될 게 없어요. 중요한 것은, 둘 다 같은 문자인 경우입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp10.png)
str1이 “ac”이고 str2도 “ac”라 해 봅시다. 이 경우 3번째 문자가 nil로 같단 말이지요. 같다고 계속 탐색하면 안 되겠지요? 따라서, 두 문자가 같은데, nil인 경우 바로 0을 리턴하게 됩니다. 정리하면
- 두 문자열을 첫 번째 문자부터 비교합니다. 문자 둘이 다를 때 까지.
- 두 문자가 널 문자가 나올 때 까지도 같다면 0을 돌려줍니다.
이를 구현하는 것은 숙제로 남겨두겠습니다.
예제 프로그램 2번을 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp11.png)
1번째에 “YES”와 “YES”를 비교하고 있어요. 두 문자열이 같단 말이지요. 따라서, 0이 리턴됩니다. 즉, 두 문자열이 같은지 비교하려면 strcmp의 리턴값이 0 인지를 검사하면 됩니다. 다음 2번째는 “abc”와 “aaz”를 비교하는 것입니다. “abc”가 “aaz”보다 사전순으로 뒤에 있으므로 0보다 큰 수가 리턴됩니다. 3번째는 1번째 인자가 “aaz”이고 2번째 인자가 “abc”입니다. “aaz”가 “abc”보다 사전순으로 앞서기 때문에, 음수가 리턴됩니다.
실행 결과는 아래와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_cmp13.png)