Home » 레퍼런스 » C » c언어 strcmp 함수로 문자열 비교를 해 봅시다.

c언어 strcmp 함수로 문자열 비교를 해 봅시다.

c언어의 string.h에는 문자열 비교를 위한 strcmp 함수가 있습니다. 이 함수에 대해 알아보겠습니다.


[그림 1] strcmp 함수

먼저 각 인자들과 리턴 값에 대한 설명은 아래와 같습니다.

  • 리턴 값
    • str1이 str2보다 사전순으로 앞서면 음수를 돌려줍니다.
    • str1이 str2보다 사전순으로 뒤에 있으면 양수를 돌려줍니다.
    • 둘 다 같으면 0을 돌려줍니다.
  • str1, str2
    • 비교할 두 문자열을 의미합니다.

비교할 때 byte 단위로 비교한다는 것을 조심해야 합니다.


보통 문자열 비교를 할 때 예제 1번과 같이 비교하면 안 될까요?

[그림 2] 예제 1번 프로그램

안 됩니다. str1과 str2가 같은지를 비교하고 있는데요. 문자열의 내용이 같은지를 비교하는 것이 아닙니다. 시작 주소가 같은지를 비교하는 것이지요.

같은가요? 별개의 공간에 위치해 있어요. 따라서, str1 == str2는 false가 되고 No가 출력됩니다.

[그림 3] 예제 1번 프로그램의 결과

No가 출력됨을 볼 수 있어요. 그래서, c언어에서 문자열을 비교할 때에는 strcmp 함수를 이용해야 합니다. 특히 같은지 검사하려면 strcmp의 리턴값이 0인지를 체크해야 합니다. 기억하기 쉽게 함수 STRing CoMPare로 기억하시면 편합니다.


이 함수가 어떻게 동작할까요? str1은 “ac”이고 str2는 “ab”라고 해 보겠습니다.

메모리 상에는 위와 같이 있습니다. 1번째 요소부터 비교해 봅시다.

str1의 1번째 문자는 ‘a’, 2번째 문자 역시 ‘a’입니다. 같지요? 따라서 2번째 요소로 넘어갑니다.

str1의 2번째 문자는 ‘b’, str2의 2번째 문자는 ‘c’입니다. 다르네요? 다르다면, 그 차이를 리턴 합니다. 이 경우, str1이 str2보다 사전 순으로 앞서므로, 음수가 돌려질 겁니다. 두 문자가 길이가 다른 경우에는 어떨까요? str1이 “acd”이고 str2가 “ac”인 경우를 봅시다.

2번째 문자를 비교해 보니, 둘 다 ‘c’로 같지요. 3번째 문자를 비교해 보겠습니다.

다르지요? 하나는 ‘d’이지만 다른 하나는 널 문자이기 때문입니다. 길이가 다른 경우, 순회 하는 과정에서 문자가 다른 곳이 생기니 문제될 게 없어요. 중요한 것은, 둘 다 같은 문자인 경우입니다.

str1이 “ac”이고 str2도 “ac”라 해 봅시다. 이 경우 3번째 문자가 nil로 같단 말이지요. 같다고 계속 탐색하면 안 되겠지요? 따라서, 두 문자가 같은데, nil인 경우 바로 0을 리턴하게 됩니다. 정리하면

  • 두 문자열을 첫 번째 문자부터 비교합니다. 문자 둘이 다를 때 까지.
  • 두 문자가 널 문자가 나올 때 까지도 같다면 0을 돌려줍니다.

이를 구현하는 것은 숙제로 남겨두겠습니다.


예제 프로그램 2번을 보겠습니다.

[그림 4] 예제 2번 프로그램

1번째에 “YES”와 “YES”를 비교하고 있어요. 두 문자열이 같단 말이지요. 따라서, 0이 리턴됩니다. 즉, 두 문자열이 같은지 비교하려면 strcmp의 리턴값이 0 인지를 검사하면 됩니다. 다음 2번째는 “abc”와 “aaz”를 비교하는 것입니다. “abc”가 “aaz”보다 사전순으로 뒤에 있으므로 0보다 큰 수가 리턴됩니다. 3번째는 1번째 인자가 “aaz”이고 2번째 인자가 “abc”입니다. “aaz”가 “abc”보다 사전순으로 앞서기 때문에, 음수가 리턴됩니다.

실행 결과는 아래와 같습니다.

[그림 5] 예제 2번 프로그램의 실행 결과

Leave a Comment

18 + 9 =