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

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

글: 시플마 2024. 4. 3.

이번에는 문자열을 이어 붙이는 함수를 다루어 보겠습니다.

 

해당 기능을 하는 함수 wcscat_s입니다.

 

세 개의 인자를 받습니다.

 

첫 번째는 인자는 목적지, 즉 이어 붙여질 문자열이죠. const가 붙지 않는 이유는

문자열이 수정되어야 하기 때문이겠죠?

 

두 번째 인자는 크기입니다. 이어 붙여질 문자열은 배열 형식일테고,

이 배열의 크기가 얼마나 있는지 알려주는 것입니다.

대입할 문자열이 너무 길어, 이어 붙여질 문자열이 들어가 있는

배열의 크기를 넘으면 오류를 표시할 것을 예상해 볼 수 있습니다. 

 

세 번째 인자는 소스, 즉 대입할 문자열입니다. const가 붙는 이유는

대입할 문자열은 수정될 필요가 없기 때문이죠.

 

 

그럼 wcscat_s 함수를 이용해서 문자열을 이어 보겠습니다.

 

문자열 abc를 저장하고 있는 변수 wc와 문자열 def를 연결하였습니다.

잘 실행되는 것을 확인할 수 있습니다.

 

주솟값을 받아야 하는 세 번째 인자를 보면

변수명을 넣은 게 아니라 바로 문자열을 넣어줬습니다.

문자열은 그 자체로 주솟값을 가지고 있기 때문에 가능한 일이겠죠?

 

 

 


 

 

 

 

만약 소스가 되는 문자열이

 

배열의 최대 크기를 넘길 정도로

크면 위와 같이 오류가 발생합니다. 

 

 

근데 두 번째 인자에

 

목적지 문자열이 담긴 배열의 실제 크기보다 큰 수를 입력하면 

오류가 발생하지 않습니다. 남은 공간에 억지로 붙인 거죠.

 

 

이런 문제를 방지하기 위해서 

 

wcscat_s 함수는 또 다른 함수 형태를 제공합니다. 

인자를 목적지 문자열과 소스 문자열 두 개만 받고

배열의 사이즈는 자동으로 계산해 주는 형식도 있습니다. 

 

 

wcscat_s 함수가 여러 가지 형태로

사용될 수 있는 것은 '함수 오버로딩' 덕분입니다.

 

위 예시처럼

같은 이름을 가진 함수를 여러 개 만들고

각자 다른 자료형의 인자를 받거나, 인자의 개수를 달리하여

다르게 작동하도록 만들 수 있습니다.

 

wcscat_s 함수도 이처럼 함수 오버로딩을 통해

다양한 방식으로 사용할 수 있게 만들어진 것입니다.

 

 

wcscat_s 함수에서 인자를 목적지 문자열과

소스 문자열 두 개만 받고 배열의 사이즈는 자동으로

계산해 주는 형식으로 사용하면 버퍼 사이즈(배열)로 인한

오류가 발생할 여지를 없앨 수 있어 좋지만, 함수 템플릿과 관련된 

내용이므로 일단 생략하도록 하겠습니다.

 

 

 


 

 

 

 

wcscat_s 함수와 똑같은 기능을 하는 함수를 직접 만들어 보겠습니다.

 

함수의 이름은 StrCpy로 하였습니다. 

 

wcscat_s 함수와 마찬가지로 세 개의 인자를 받는 것으로 합니다. 

첫 번째 인자는 목적지 문자열, 두 번째 인자는 배열의 크기, 세 번째 인자는

소스 문자열입니다. 

 

26 ~ 27번째 줄은 목적지 문자열과 소스 문자열의 길이를 

구하는 코드입니다. GetLength 함수는 문자열의 길이를 반환하는

직접 작성한 코드입니다. GetLength 함수를 통해 구한 길이를

각각 변수에 저장합니다.

 

29 ~ 32번째 줄은 예외 처리입니다. 

목적지 문자열과 소스 문자열, 공백 길이(+1)까지

합한 값이 배열의 크기보다 크면 

assert 매크로를 통해 오류 메시지를 띄웁니다.

(assert를 사용하려면 전처리기 지시문을 통해

assert.h 파일을 포함해야 합니다.)

 

그리고 본격젹으로 문자열을 이어 붙이는 코드를 

작성하기 전에 차근차근 달성 목표를 작성해 봅니다.

무작정 코드를 작성하는 것보다 계획적으로 설계를 하는 것이

결과적으로 시간을 아낄 수 있는 길입니다.

 

첫 번째로 생각해야 할 것은 목적지 문자열의 끝부분 파악입니다.

목적지 문자열의 끝부분에는 NULL 문자가 들어가 있을 것이고

NULL 문자 대신 소스 문자열의 첫 번째 문자가 들어가야 할 것입니다.

36번째 줄을 보면 목적지 문자열의 길이를 값으로 인덱스에 접근했습니다.

목적지 문자열의 길이가 3이라면 0, 1, 2번 인덱스에 문자가 들어가 있을 것이고

3번 인덱스에 NULL이 들어가 있을 것이기 때문입니다.

(설계 과정을 보여드린 것일 뿐 36번째 줄은 지워도 됩니다.)

 

두 번째로 생각해야 할 것은 목적지 문자열의 NULL이 들어간 

바로 그 부분에 소스 문자열의 첫 번째 문자를 넣는 것입니다.

39번째 줄을 보시죠. 변수 iSrctLen에는 소스 문자열의 길이값이

들어가 있습니다. 이로 인해 얼마나 반복할지 예상할 수 있으므로

while문보다는 for문으로 작성하도록 합니다. i가 iSrctLen + 1만큼

반복하는 이유는 소스 문자열의 NULL 문자까지 붙이기 위함입니다.

 

41번째 줄에서 문자열 이어 붙이는 작업이 시작됩니다.

목적지 문자열의 길이 + 1한 값을 인덱스로 하여 

그곳부터 소스 문자열의 시작 문자를 대입하기 시작합니다.

목적지 문자열의 길이에 1을 더하는 이유는

목적지 문자열의 NULL 문자부터 바로 소스 문자열을 

이어 붙이기 위함입니다.

 

 

실행해 보니

 

잘 작동하는 것을 확인할 수 있습니다.

 

 

또한

 

두 문자열의 길이를 합한 값에서 1을 더한 값보다

배열의 크기를 작게 설정하면 오류를 띄우는 모습까지 확인할 수 있습니다.

 

 

 

 

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


 

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

C++ 기초 : 구조체 포인터  (0) 2024.04.04
C++ 기초 : wcscmp 함수  (0) 2024.04.04
C++ 기초 : 문자열 (3)  (0) 2024.04.03
C++ 기초 : 문자열 (2)  (0) 2024.04.03
C++ 기초 : 문자열 (1)  (0) 2024.04.02