상세 컨텐츠

본문 제목

C++ C스타일 문자열 strcpy_s, strcat_s

C++/Problems

by McRobbin 2020. 9. 25. 19:37

본문

C++ 의 C 스타일 문자열 처리 공부한 것 내용정리.

 

 

1. strlen(const char* Str)

문자열 길이 뽑아주는 함수 입니다.

 

쓰기 편하지만 주의할 점이 몇가지 있습니다.

 

1-1. char* 할당.

매개 변수로 const가 아닌 char* 를 넣으실 때 할당과 초기화가 되어있는지 확인하세요.

혹시나 C 스타일로 문자열을 동적으로 구성하고 싶으시다면 주의해야 합니다.

 

또한 문자열의 경우 마지막 '\0' 문자가 하나 들어가게 되는데 이것을 고려하지 않으니

주의하세요.

 

1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
using namespace std;
 
int main()
{
    const char* s1 = "asd";
    cout << s1 << endl// 출력 결과 : asd.
    cout << strlen(s1) << endl// 출력 결과 : 3.
}
 
 

 

 

2. strcpy_s(char* _Destination, size_t size, const char* _Source)

문자열을 복사해 주는 함수 입니다.

Destination에 목적지 포인터 변수를, 두번째에 복사할 문자열의 사이즈, 세번째에 복사할 문자열 입니다.

 

마찬가지로 주의할 점이 있습니다.

 

2-1. 문자열 길이.

사이즈를 넘겨줄 때 strlen() 이나 sizeof() 많이 씁니다. 다만 아까 설명한 마지막 \0 문자를 고려하지 않기 때문에

사이즈를 넘겨줄 때 마지막 하나를 비워둔 상태로 넘겨줘야 합니다.

 

또한 Destination의 할당된 길이가 Source보다 작으면 안됩니다.

Destination의 최소 길이는 strlen(Source) + 1 이 되겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
int main()
{
    char* dest;
    const char* source = "asd";
    // source의 사이즈 + 1 만큼 지정. \n문자 자리.
    dest = new char[strlen(source) + 1];
 
    // 복사할 때 또한 Size + 1
    strcpy_s(dest, strlen(source) + 1, source);
 
 
    // 출력 : asd.
    cout << dest << endl;
    // 출력 : 3
    cout << strlen(dest) << endl;
}
 
 

 

 

3. strcat_s(char& Destination, size_t size, const char* source)

문자열을 Destination에 이어붙여주는 함수 입니다.

 

3-1 문자열 길이.

마찬가지로 dest에 충분한 공간이 할당되어 있는지 확인해야 합니다.

이미 dest에 들어가 있는 문자열과 Source의 문자열을 합했을 때 dest에 충분한 공간이 있는지

확인하고 사용하세요.

 

또한 dest에 end표시 문자가 있다면 그것을 제거하고 뒤로 붙여주기 때문에

마지막 end 고려시에 원래 dest의 사이즈 + source의 사이즈 + 1이 최종적으로 필요한

사이즈 되겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
int main()
{
    const char* source1 = "asd";
    const char* source2 = "zcxv";
 
    char* dest = new char[strlen(source1) + strlen(source2) + 1];
    strcpy_s(dest, strlen(source1) + 1, source1);
 
    // 출력 결과 : asd.
    cout << dest << endl;
    // 출력 결과 : 3.
    cout << strlen(dest) << endl;
 
 
    strcat_s(dest, strlen(dest) + strlen(source2) + 1, source2);
    // 출력 결과 : asdzxcv.
    cout << dest << endl;
    // 출력 결과 : 7.
    cout << strlen(dest) << endl;
}
 
 

 

 

마지막으로 이 두개를 이용해 예시를 하나 작성해 보겠습니다.

String 클래스 한번 만들어 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstring>
 
using namespace std;
 
class String
{
private:
    char* _chars;
 
public:
    String() = default;
 
    String(const char* chars) : _chars(new char[strlen(chars) + 1])
    {
        strcpy_s(_chars, strlen(chars) + 1, chars);
    }
 
    String(const char* chars1, const char* chars2) : _chars(new char[strlen(chars1) + strlen(chars2) + 1])
    {
        // 두 문자열 길이 + 1 사이즈 동적 할당.
        strcpy_s(_chars, strlen(chars1) + 1, chars1);
        strcat_s(_chars, strlen(chars1) + strlen(chars2) + 1, chars2);
    }
 
    size_t size() const
    {
        return strlen(_chars);
    }
    
    void print()
    {
        cout << _chars << endl;
        cout << "size : " << this->size() << endl;
    }
 
    virtual ~String()
    {
        delete[] _chars;
    }
};
 
int main()
{
    String s1("Hello");
    s1.print();
    // 출력 결과 : Hello, 5
 
    String s2("World");
    s2.print();
    // 출력 결과 : World, 5
 
    String s3("Hello"" World");
    s3.print();
    // 출력 결과 : Hello World, 11
}
 
 

간단한 예시를 적어봤습니다.

 

String이라는 클래스를 하나 만들고 생성자에 문자열 형식이 하나 들어오면 그 값을 복사해 집어넣는 클래스 입니다.

 

매개변수로 문자열 두개가 들어오면 두개를 concat해서 가지고 있도록 했습니다.

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

C++ Union 데이터 타입  (0) 2020.09.26
C++ const 사용.  (0) 2020.09.25

관련글 더보기