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 |