더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 23.문자열-4

더듬이 2021. 9. 23. 19:08
728x90

함수 오버로딩이란?

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(){

}
728x90

'프로그래밍 언어 > 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