본문 바로가기
C언어

C언어 // 알아두면 쓸모 있는 지식 2. 문자열 비교하기

by algosketch 2019. 8. 15.

 우리는 두 문자열 str1, str2가 같은지 알고 싶다. 하지만 str1과 str2의 문자열이 같든 다르든 str1 == str2 이런식으로 연산을 한다면 원하는 결과를 얻기 힘들다. 정확한 비교를 위해서는 다음과 같이 비교해야 한다.

/*
#include <stdio.h>
#include <string.h>
*/

if (!strcmp(str1, str2)) printf("두 문자열은 동일하다");

 참고로 strcmp 는 string comparison 에서 나온 듯 하다. 그리고 위 조건식은 strcmp(str1, str2) == 0과 동일하다. strcmp는 두 문자열이 얼마나 다른지 그 수치를 반환하는 함수이다. 반환되는 값은 사전순(아스키코드 순)과 관련이 있다. 따라서 0이라는 값이 반환된다면 두 문자열은 0만큼 다르다. 즉, 같다는 의미이다. 하지만 0이 아닌 값이 반환 된다면 두 문자열을 다르다는 뜻이다. 그 값이 양수든 음수든 C언어에서는 0이 아닌 값을 참으로 인식하기 때문에 !strcmp()는 두 문자열이 같을 때 참을 반환한다.

 두 문자열을 비교하는 방법을 알았으니 이제는 str1 == str2 같은 문장이 왜 안 되는지 알아보자. 물론 C언어에서는 안 되지만 오래되지 않은 언어는 예상대로 동작할 수도 있다. 혹은 str1 === str2 와 같은 연산자를 지원하기도 한다. 우리가 str1와 str2을 동일한 문자열로 채운다고 가정하자. str1, str2을 순차적으로 초기화했다고 쳤을 때, 예를 들어 str1은 메모리 주소 0x1000번지에 저장되고 str2는 0x1010번지에 저장된다. 그리고 배열의 이름은 포인터(주소값)라고 공부했을 것이다. str1과 str2는 char형 배열이므로 (char*)형이 된다. str1 == str2 를 비교하게 되면 0x1000 == 0x1010 과 같은 꼴이 되어 문자열이 같더라도 주소가 다르기 때문에 거짓을 반환하게 된다.

 추가로 두 문자열을 비교할 때 입력의 실수로 문자열 마지막에 공백이나 개행문자가 들어가 같은 문자열로 생각되는 다른 문자열이 될 수도 있으니 주의하자!