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++ Union 데이터 타입 (0) | 2020.09.26 |
---|---|
C++ const 사용. (0) | 2020.09.25 |