본문 바로가기
C++/기초

C++ 기초 : wcscmp 함수

글: 시플마 2024. 4. 4.

wcscmp 함수는 두 개의 문자열을 비교합니다.

그리고 같으면 0, 왼쪽이 우열이 높으면 -1, 오른쪽이 

우열이 높으면 1을 반환합니다.

 

여기서 우열이 높다라는 것은 사전순으로 따져보았을 때

먼저 오는 것이라는 의미이죠.

 

 

아래 코드를 보시죠.

 

문자열 "abc" 두 개를 비교하였을 때 0을 반환합니다.

 

문자열 "abc"와 "bbc"를 비교하였더니 -1을 반환하네요.

사전순으로 보았을 때 a가 더 먼저이므로 왼쪽 문자열이 우열이 높다고

판단하였고 -1을 반환하는 모습입니다.

 

문자열 "bbc"와 "abc"를 비교하였더니 1을 반환하네요.

사전순으로 보았을 때 a가 더 먼저이므로 오른쪽 문자열이 우열이 높다고

판단하였고 1을 반환하는 모습입니다.

 

 

그럼 길이가 다른 경우는 어떨까요?

앞에 문자가 같다면 더 긴 쪽이 우열이 낮습니다.

위 코드에서 두 문자열을 비교하였을 때 왼쪽이

더 높다고 판단하여 -1을 반환하네요.

 

 

물론 아래 코드처럼

 

길다고 무조건 우열이 낮은 것은 아닙니다.

결국 두 문자열을 비교하였을 때 첫 문자부터 우열이 낮으면

그쪽이 더 낮다고 판단하는 것이죠.

 

 

 


 

 

 

 

 

wcscmp 함수를 직접 구현해 봅시다.

 

이름 StrCmp로 하겠습니다.

 

반환값이 있고 그것이 음수일 때도, 양수일 때도 있으므로

반환 자료형을 unsigned로 설정하면 안되겠죠? 

 

단순히 두 문자열을 비교만 하면 되는 함수이기 때문에

포인터 변수로 주솟값을 받을 수 있도록 하되, 수정은 불가능하도록

const로 선언하였습니다.

 

48 ~ 53

GetLength 함수를 통해 두 문자열의 길이를 구하고 

왼쪽 문자열의 길이값을 lStrLen에 

오른쪽 문자열의 길이값을  rStrLen에 저장합니다.

(GetLength 함수는 별도로 만든 함수입니다. wcslen 함수와 같은 기능을 합니다.)

 

두 문자열의 길이를 저장하는 이유는 두 가지입니다.

 

1. 두 문자열의 길이를 비교하여 더 긴 쪽이 우열이 낮을 것으로 

가정하고 함수를 진행하기 위해.

 

2. 이후 for문을 통해 두 문자열의 문자를 하나씩 비교할 것인데

그때 for문을 최소한으로 동작하게 하기 위해.

 

for문의 반복 횟수를 정하기 위해 선언한 변수 iLoop에 일단

왼쪽 문자열의 길이를 저장합니다. 이유는 이후 왼쪽 문자열이

짧으면 반환값을 -1로 할 예정이고, 오른쪽 문자열이 짧으면 1로

할 예정입니다. 이때 iLoop의 값에 오른쪽 문자열의 길이를 대입할

것입니다. 두 문자열의 길이가 같으면 반복 횟수를

어느 쪽 문자열의 길이로 하여도 문제가 없기에 일단 왼쪽 문자열의

길이를 대입하는 것이죠.

 

 

55 ~ 63

만약 왼쪽 문자열의 길이가 더 길다면

iLoop에 오른쪽 문자열의 길이값을 대입하고

함수가 반환할 때 사용할 변수 iReturn에 1을 넣습니다.

 

만약 오른쪽 문자열의 길이가 더 길다면

함수가 반환할 때 사용할 변수 iReturn에 -1을 넣습니다.

 

 

65 ~ 75

두 문자열을 처음 문자부터 하나씩 비교하기 위해 for문을 실행합니다.

두 문자열 중 짧은 문자열의 길이만큼만 비교해도 두 문자열의

우열을 판단할 수 있으므로 변수  iLoop를 이용해 최소한만 반복하도록 합니다.

 

만약 왼쪽 문자열의 문자의 값이 더 작으면( ASCII 코드 기준)

바로 -1을 반환하고 함수를 종료합니다.

 

만약 오른쪽 문자열의 문자의 값이 더 작으면( ASCII 코드 기준)

바로 1을 반환하고 함수를 종료합니다.

 

 

77

여기까지 함수가 진행됐다는 것은위에서 반환이 진행되지 않았다는 의미입니다.

즉 for문에서 모든 문자열을 비교하였는데 같았다면 이 코드까지 오는 것이죠.

 

그럴 경우는 iReturn의 값을 바로 반환합니다.55 ~ 63번째 줄에서

오른쪽이 짧으면 1을, 왼쪽이 짧으면 -1을 대입했죠?

만약 두 문자열의 길이가 같아 아무것도 대입되지 않았다면

변수 iReturn의 초기화값인 0을 반환할 것입니다.

두 문자열이 길이도, 문자도 모두 같다는 의미겠죠.

 

 

 


 

 

 

방금 만든 StrCmp 함수를 통해 두 문자열을 비교해 볼까요?

 

두 문자열이 같은 경우

 

0을 반환합니다.

 

 

오른쪽 문자열의 우열이 더 높은 경우

 

1을 반환합니다.

 

 

왼쪽 문자열의 우열이 더 높은 경우

 

-1을 반환합니다.

 

 

두 문자열을 비교하였을 때 앞쪽이 같지만

 

왼쪽 문자열이 더 짧을 경우 -1을 반환합니다.

 

 

두 문자열을 비교하였을 때 앞쪽이 같지만

 

오른쪽 문자열이 더 짧을 경우 -1을 반환합니다.

 

 

오른쪽 문자열이 더 짧지만

 

왼쪽 문자열의 문자가 우열이 높은 경우 -1을 반환합니다.

 

 

실행 결과를 보니 잘 작동하는 것 같네요.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 동적 할당 (1)  (0) 2024.04.04
C++ 기초 : 구조체 포인터  (0) 2024.04.04
C++ 기초 : 문자열 (4)  (0) 2024.04.03
C++ 기초 : 문자열 (3)  (0) 2024.04.03
C++ 기초 : 문자열 (2)  (0) 2024.04.03