안녕하세요 넬다이입니다.
오늘은 11일 차 문자열에 대해서 정리해볼 생각입니다.
11일 차까지 이렇게 진행하다 보니 다들 힘드실 텐데 다들 파이팅입니다.
문자열이란
'c', 'h', 'a', 'r'
각자 있으면 한 개의 단일 문자에 불과하다.
이것을 연달아서 "char" 이렇게 표현하면 연이어 있는 문자들의 모임으로 이것을 문자열이라고 한다.
단일 문자.
작은따옴표로 표현을 하고
char cA = 'A';
char cArray[5];
cArray[0] = 'A';
cArray[1] = 'B';
cArray[2] = 'C';
cArray[3] = 'D';
문자열 같은 경우는
큰따옴표로 처리를 한다.
"ABCD"
단일 문자의 배열로 문자열을 표현할 수 있다.
char 타입은 오래된 문자열 타입이며 지금은 char 형은 잘 사용하지 않는다.
하지만 사용법은 알아야 하는 게 옛날 소스들을 최근 소스로 변경하는 것을 리팩터링이라고 하는데,
이런 작업에서 char 형이 사용된 경우도 있기 때문이다.
우리가 지금 공부할 것은 char 타입이며 char는 기억 장소 1byte를 차지한다
char szTest[10] = "Nell";
cout << szTest << endl;
char szTest2[5];
szTest2[0] = 'N';
szTest2[1] = 'E';
szTest2[2] = 'L';
szTest2[3] = 'L';
cout << szTest2 << endl;
NULL 문자를 만나기 전까지 계속해서 출력이 되는 형태이므로
위와 같은 szTest2 배열은 문자열이라고 할 수 없다.
szTest = "NellDie"; 배 열명은 주소이긴 하지만 다른 주소를 가리키도록 할 수 없다.
"abcd" 이런 형태로 코드상에 작성한 문자열을 상수 문자열이라고 하는데
(상수 메모리 공간에) 메모리에 등록이 된다.
char* p = "abcd";
이런 형태의 사용은 가능하다.
cout << p << endl;
char szTest3 [] = "abcd";
이런 형태로도 가능하다.
cout << szTest3 << endl;
문자열의 내용은 같아도 다른 문자열이고 다른 주소에 저장된다.
문자열의 내용을 변경하기 위해 제공되는 함수.
strcpy() 함수.
문자열의 메모리를 1:1로 복사해 주는 역할을 한다.
char 배열 이름에 대입 연산이 불가능하기 때문에
문자열을 복사해서 넣어주는 역할을 한다.
char szTest[20] = {0};
//복사될 공간, 복사할 문자열
strcpy(szTest, "NellDie");
//복사될공간, 복사될 크기, 복사할 문자열
strcpy_s(szTest, sizeof(char) * 10, "TEST");
cout << szTest << endl;
strcpy 함수의 취약성 - 복사가 될 공간의 크기와 상관없이 뒤에 두 번째 문자열을 그냥 복사해 버리기 때문에
메모리 침범이 발생할 위험이 존재한다.
strlen() 함수
문자열의 길이를 반환해 주는 함수이다.(NULL 문자는 카운팅 되지 않는다.
char szTest[20] = {0};
int iLength = strlen(szTest);
cout << iLength << endl;
sizeof() 와는 다르다.
문자 배열의 총크기가 나오는 것이고 strlen() 은 NULL 문자를 제외한 문자열의 길이를 반환해 주는 것이다.
strcat() 문자열 결합 함수
뒤에 있는 문자열을 앞에 문자열 뒤에 이어 붙이는 함수이다.
char szTest[20] = {0};
//strcat(szTest, "NellDie");
strcat_s(szTest, "NellDie");
//최신 함수인 _s함수를 사용해서 경고를 없애 주는 것이 좋다.
//버전이 올라감에 따라서 str함수들도 업그레이드 된 버전을 권장하고 있다.
cout << szTest << endl;
strcmp() 문자열 비교 함수
두 개의 문자열을 비교해서 문자열이 같다면 0을 반환하고 다르면 1 또는 -1을 반환한다.
char szName[20] = "NellDie";
cout << strcmp(szName, "What") << endl;
//-1이 나오는 조건.
//뒤에 것이 아스키 코드상 숫자로 더 큰 경우.
cout << strcmp("A", "B") << endl;
//1이 나오는 조건.
//뒤에 것이 아스키 코드상 숫자로 더 작은 경우.
cout << strcmp("B", "A") << endl;
팁
_s 가 붙은 문자열 함수와 일반 함수의 차이는 안정성의 차이인데 경고가 붙는 것보다
웬만하면 경고도 다 잡아 주는 것이 좋습니다.
따라서 경고가 발생한다면 _s함수를 사용할 것.
또한 오류 항목을 보시면 자세하게 나와있으니 오류 목록만 봐도 이해 가능합니다.
'개발 > C&C++' 카테고리의 다른 글
(C/C++ 속성 정리) 15일 차 : 포인터와 동적할당 (0) | 2020.07.05 |
---|---|
(C/C++ 속성 정리) 14일 차 : 함수의 사용방법 (0) | 2020.07.04 |
(C/C++ 속성 정리) 13일 차 : typedef , 구조체 (0) | 2020.07.03 |
(C/C++ 속성 정리) 12일 차 : string 컨테이너 (0) | 2020.07.02 |
(C/C++ 속성 정리) 10일 차 : 포인터 심화 및 2차원 배열 (0) | 2020.06.29 |
(C/C++ 속성 정리) 9일 차 : 포인터와 배열 (0) | 2020.06.28 |
(C/C++ 속성 정리) 8일 차 : 포인터 (0) | 2020.06.27 |
(C/C++ 속성 정리) 7일 차 : 바이트의 저장순서 및 별찍기 (0) | 2020.06.25 |