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

C++ 기초 : 문자열 (3)

글: 시플마 2024. 4. 3.

문자열의 길이를 반환해 주는 함수로는 'wcslen'가 있습니다.

 

이것을 직접 구현해 볼까요?

 

아래 코드를 보시죠.

 

기본으로 제공되는 함수 wcslen과 같은 기능을 하는

함수 GetLength를 만들었습니다.

 

반환 타입을 unsigned int로 설정했습니다. 이유는 

문자열의 길이를 반환하는 함수이므로 음수가 나오면 안되기 때문이죠.

 

함수 GetLength는 const wchar_t형 포인터 변수를 요구합니다.

문자열의 내용을 확인하기 위해 포인터 변수를 통해 문자열의 주솟값을 저장하고,

문자열의 값을 수정하지 않는다는 것을 의미하기 위해서 const를 붙였습니다.

 

그리고 int형 변수 i를 선언하였습니다. i는 문자가 있다는 것이 확인될 때마다

1씩 증가하며 함수가 종료되면 이 값을 반환할 것입니다.

 

문자열이 들어오면 처음부터 끝까지

하나씩 확인해야 하므로 반복문을 사용해줄 겁니다. 

무작위로 문자열이 해당 함수에 들어오겠죠?

어떤 길이를 가진 문자열이 들어올지 알 수 없기 때문에 

몇 번을 셀지 정하기 힘듭니다. 그래서 미리 조건을 설정하는 for문보다는

while문을 사용하도록 하겠습니다. 일단 true로 설정하고 진행하겠습니다.

 

10번째 줄에서 wchar_t형 변수 c를 선언하고 원본 문자열의 주솟값을

저장하고 있는 포인터 변수 _pStr를 역참조하여 그곳에 있는 값을 대입합니다.

_pStr에 i의 값을 더해 주소 연산을 하며 처음부터 하나씩 값을

복사하여 wchar_t형 변수 c에 넣는 것이죠.

 

이렇게 c에 문자를 넣는 이유가 있습니다.

문자열 끝에는 NULL 문자가 있습니다. 

이 NULL 문자를 만나면 더는 길이를 세지 않고

while문을 빠져나가기 위해서죠.

12 ~ 15번째 줄에 있는 if문이 바로 그 동작입니다.

c에 NULL 문자(ASCII 코드에 따라 '\0' 또는 0으로 표현)가 

대입되는 순간 if문이 작동하고 break문을 만나 while문을 나갑니다.

이후 i의 값을 반환합니다.

 

근데 이 if문이 작동하지 않는다는 것은 아직 문자열의 끝이 

아니라는 의미이므로 i의 값을 올리고 다음 문자가 들어있는 공간을

확인하기 위해 while문을 반복합니다.

 

참고로 if문 조건식을 보면 rvalue, 즉 상수인 '\0'을 왼쪽에,

lvalue인 변수 c를 오른쪽에 배치하였는데 이러한 습관을 들이는 것이 

좋습니다. 반대로 작성하고 같음을 의미하는 비교 연산 '=='을

실수로 '='로 작성하게 되는 경우, 즉 c = '\0' 로 작성하게 되는 경우 

c에 NULL이 대입되면서 오류가 발생합니다. 하지만 문법상

문제가 되지 않기 때문에 어디서 오류가 발생했는지 찾기 어려워집니다.

그러나 위 코드처럼 작성한 후, 비교 연산을 '='로 잘못 작성하면

문법 오류로 잡히기 때문에 실수를 바로 알아차릴 수 있습니다.

 

 

 


 

 

 

 

함수 GetLength를 조금 더 다듬어 보면

 

위 코드처럼 작성이 가능합니다.

 

while문이 반복될 조건을, 무조건 반복하는 true가 아닌,

문자열의 값이 NULL이 아니라면 반복하는 것으로 바꾸었습니다.

 

만약 문자열의 값이 NULL이라면 while문을 빠져나가고  i 값을 반환하겠죠.

 

 

처음 작성한 코드는 동작을 직관적으로 볼 수 있다는 장점이 있지만

코드가 길어진다는 단점이 있고, 다음에 작성한 코드는 길이가 짧다는

장점이 있지만 직관적으로 이해하기 어렵다는 단점이 있습니다.

 

어떤 방식으로 코드를 작성할지는 스타일의 따라 선택해 주시면 되겠습니다.

 

 

 

 

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


 

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

C++ 기초 : wcscmp 함수  (0) 2024.04.04
C++ 기초 : 문자열 (4)  (0) 2024.04.03
C++ 기초 : 문자열 (2)  (0) 2024.04.03
C++ 기초 : 문자열 (1)  (0) 2024.04.02
C++ 기초 : 문자  (0) 2024.04.01