반응형

 두 문자열을 비교하려고 합니다. 어떻게 하면 좋을까요?

 

 

 이렇게 비교하면 어떨까요? 실제로는 not equal이 뜹니다. 왜 그럴까요?

 

 

 

 실제로 p1과 p2는 다른 위치에 메모리상에 할당되어 있기 때문입니다. 정확히는 p1은 p1 배열이 시작하는 주솟값을, p2는 p2배열이 시작하는 주솟값을 가지고 있을 겁니다. 이 둘은 다르기 때문에, p1과 p2를 비교하면 다르다고 출력이 됩니다. 내용이 같음에도 불구하고요. 이것을 손쉽게 하는 방법이 없을까요?

 

 


 <string.h> 안에는 strcmp 함수가 있습니다. 이 함수는 다음과 같습니다.

 

 

int strcmp(const char *str1,const char *str2);

 

 

 str1이 str2보다 사전순으로 앞서면 음수를, 같으면 0을, 뒤이면 양수를 리턴합니다. 보통, 어떠한 문자열이 "exit"인가? 혹은 "quit" 인가 등을 판단할 때 왕왕 쓰이곤 합니다. 문자열 a가 b보다 사전순으로 앞서 있는지는 음수인지 양수인지에 따라서 판단할 수 있는데요.

 

 일단 같으면 0이 리턴됩니다. 그런데 두 문자열이 다르다면, 그게 문제가 될 수 있는데요.

 

 

 사전순이 어떤 사전순을 의미할까요? 아스키 코드 값이에요. 보통은. 즉, 소문자 a는 대문자 Z보다 뒤에 있어요. 그렇기 때문에 "abcd"보다 "Zoo"가 더 앞섭니다. 프로그램을 실행해 보면 알 수 있어요.

 

 

 이 예제 프로그램을 실행시켜보면 결과가 어떻게 나올까요?

 

 

 결론적으로는 양수가 나옵니다. a가 Z보다 아스키 코드 값을 따져보면 뒤에 있기 때문입니다. 이 부분은 조심하셔야 할 부분입니다.

 

 


 strcmp는 어떤 식으로 동작할까요? 생각보다 간단합니다. p1과 p2를 비교해야 할 문자열이라고 합시다. 그럴 때, p1[i]와 p2[i]가 같지 않거나, p1[i]와 p2[i] 둘 다 NULL 문자일 때 까지 비교합니다. 예를 들어봅시다.

 

 

 p1[0]과 p2[0]이 같아요. 같고, NULL 값이 아니므로 넘어갑니다.

 

 

 여기서 보니까 두 친구가 다르네요. null과 'b'는 다릅니다. 따라서, 이 때 p1[1] - p2[1]을 리턴합니다. null 문자의 아스키 코드 값은 0이니까 strcmp(p1,p2) < 0입니다.

 

 

 만약에 두 녀석이 같다면 어떨까요? 일단 p1[1]과 p2[1]이 같으니까 p1[2]랑 p2[2]랑 compare 합시다.

 

 

 비교를 했는데, 둘 다 NULL값인가요? 따라서, 이 때 p1[2] - p2[2] 값이 리턴이 되는데요. 두 값이 같으므로, 최종적으로는 0을 돌려주게 됩니다.

 

 


 문제 상황을 하나 드리겠습니다.

 

 저는 moo가 저장되어 있는 자료구조 (배열, vector)를 '아스키 코드' 사전순으로 정렬하고 싶습니다. sort를 하기 위해서, compare 함수를 작성하려는 경우, 2개의 인자가 필요합니다. 객체 1과 객체 2. 만약에 객체 1이 객체 2보다 사전순으로 앞선다면 true를, 아니라면 false를 리턴해 주면 됩니다.

 

 이것을 간단하게 알고 있다면 moo a와 moo b가 넘어왔을 때, a.str과 b.str을 strcmp로 비교했을 때, 음수라면 true가 리턴되게 하면 된다는 것을 알 수 있어요. 물론 더 좋은 방법은 그냥 string에다가 넣는 것이긴 합니다.

반응형

댓글을 달아 주세요

  1. 곰곰지영

    으... 어려워용ㅎㅎ