본문 바로가기

개발/C&C++

(C/C++ 속성 정리) 11일 차 : 문자열 및 문자열 함수

안녕하세요 넬다이입니다.

 

오늘은 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함수를 사용할 것.

또한 오류 항목을 보시면 자세하게 나와있으니 오류 목록만 봐도 이해 가능합니다.