함수 오버로딩이란?
void Test(int a){
}
void Test(int a,int b){
}
void Test(int a, float b){
}
같은 함수 이름이라도, 매개변수의 개수나 자료형을 구분하여 각 해당되는 함수가 호출되는 것을 함수 오버로딩 이라고 한다.
즉,
Test(5);
Test(5,10);
Test(5,15.54);
같은 이름의 함수라도 각 다른 함수를 호출하는 것이다!
문자열 이어 붙이기 함수 직접 만들기
문자열-3에서 포스팅했던 함수 wcscat_s도 오버로딩 된 함수이다.
매개변수를 3개받는 경우도 있는데, 이 경우의 함수를 만들어보자.
void StrCat(wchar_t* pDest,unsigned int Size,const wchar_t pSrc){
}
일단 원본 문자열 포인터,(변경이 가능해야 하므로 상수화 X)
버퍼의 최대 길이(배열의 길이)
변경이 되어서는 안되는 상수화 문자열 포인터
이 세가지의 매개변수가 필요하다.
가운데 매개변수는?
원본 문자열의 공간이 100이고, 50이 차있는데, 추가할 문자열의 크기가 50이 넘어버리면, 오류가 날 것이다.
일단, 이를 먼저 구현해보자.
원본 문자열의 길이+이어붙일 문자열의 크기+1(널문자)이 가운데 매개변수를 초과하면 안된다.
그러기 위해서는 각 문자열의 길이를 알아야 하는데, 저번 포스팅에 이미 구현해 보았다.
이를 그냥 가져다 쓰면 될 것이다!
이것이 바로 모듈화!
unsigned int GetLength(const wchar_t* Ptr) {
int length = 0;
while (*(Ptr + length) != '\0') {//Ptr[length]와 같음
length++;
}
return length;
}
void StrCat(wchar_t* pDest, unsigned int Size, const wchar_t pSrc) {
int iDestLen = GetLength(pDest);
int iSrcLen = GetLength(pSrc);
if (iDesLen + iSrcLen + 1 > Size)
assert(nullptr);
//문자열의 총 크기 구하기
}
저번에 만들었던 문자열 길이 구하기 함수를 이용했다.
만약 두 문자열의 길이+1이 Size보다 크다면 경고를 알ㄹ리도록 했다.
문자열 이어 붙이는 알고리즘
총 3단계로 이루어진다고 볼 수 있다.
1.원본 문자열의 끝을 확인(문자열이 이어 붙을 시작 위치)
2.추가 문자열을 처음부터 반복 시작해서, 원본 문자열의 끝에 계속 복사
3.추가 문자열의 NULL문자, 즉 끝을 만날 떄 까지
1.
iDestLen //원본 문자열의 끝 인덱스
아까 구했던 길이가 원본 문자열의 끝 인덱스이다!
2.
for (int i = 0; i < iSrcLen; i++)
pDest[iDestLen + i] = pSrc[i];
마지막 인덱스 + i 의 값을, 뒤 문자열의 길이만큼 차례로 증가하면 복사해간다!
하지만, 마감 NULL문자는??
3.
for (int i = 0; i < iSrcLen+1; i++)
pDest[iDestLen + i] = pSrc[i];
한번 더 반복해준다면, 자연스럽게 널문자까지 같은 받을 수 있을 것이다.
완성
#include <iostream>
#include <stdio.h>
using namespace std;
unsigned int GetLength(const wchar_t* Ptr) {
int length = 0;
while (*(Ptr + length) != '\0') {//Ptr[length]와 같음
length++;
}
return length;
}
void StrCat(wchar_t* pDest, unsigned int Size, const wchar_t* pSrc) {
//이어붙인 문자열의 크기가 SIze를 넘어가는지 계산
int iDestLen = GetLength(pDest);
int iSrcLen = GetLength(pSrc);
if (iDestLen + iSrcLen + 1 > Size)//NULL문자 까지 계산
_ASSERT(nullptr);
//문자열의 총 크기 구하기
/*문자열의 이어붙이기 단계
1.원본 문자열의 끝을 확인(문자열이 이어 붙을 시작 위치)
2.추가 문자열을 처음부터 반복 시작해서, 원본 문자열의 끝에 계속 복사
3.추가 문자열의 NULL문자, 즉 끝을 만날 떄 까지
*/
for (int i = 0; i < iSrcLen+1; i++)
pDest[iDestLen + i] = pSrc[i];
}
int main(){
}
'프로그래밍 언어 > C++ [기본]' 카테고리의 다른 글
[C++기본] 25.구조체 포인터 (0) | 2021.09.23 |
---|---|
[C++기본] 24.문자열-5 (0) | 2021.09.23 |
[C++기본] 22.문자열-3 (0) | 2021.09.23 |
[C++기본] 21.문자열-2 (0) | 2021.09.23 |
[C++기본] 20.문자열-1 (0) | 2021.09.23 |