개발 Study

#16. 문자 배열

HYuk 2021. 4. 14. 01:53
728x90

#문자 배열

일반적으로 char 변수 하나에는 하나의 문자만 들어간다.

그것을 쉽게 저장할 수 있도록 배열을 사용 하는 것이다.

char szBuff[10];

문자 배열의 경우 초기화 시에 큰따옴표(" ")를 사용한다.

 

char szBuff[10] = "Hello";

이때 문자 배열에는 다음과 같이 배열이 된다.

szBuff[0] = 'H';

szBuff[1] = 'e';

szBuff[2] = 'l';

szBuff[3] = 'l';

szBuff[4] = 'o';

szBuff[5] = '\0';

 

위와 같이 마지막 배열에는 '\0 ' 즉 NULL이 삽입되어있다.

 

이 '\0'이 하는 일은 문자열을 [0]부터 쭉 읽다가 \0을 만나는 순간 읽는 것을 정지 한다는 뜻이다.

 

따라서 저 상태에서 szBuff[2] = '\0'; 을 삽입 할 시에 He 까지만 출력되고 읽는 것을 중지한다.

 

#include <iostream>

using namespace std;

void main()
{
	char szBuff[10] = "Hello";
	cout << szBuff << endl;
	cout << "================" << endl;
	szBuff[2] = '\0';
	cout << szBuff << endl;
}

이와같이 '\0' 의 자리도 있어야 하기 때문에

문자 배열에서는 문자의 자리와 NULL의 자리가 필요하다. (한칸이 추가적으로 더 필요하다)

즉, "Hello"를 문자배열에 저장 하려면 char c[5] = "Hello"; 가 아니라 char c[6] = "Hello"; 이어야 한다

 

 

위와 같이 출력 했을 때, 기존 int 의 배열과는 차이점이 있다.

int 의 배열의 경우에는

배열 int Arr[5] = {1,2,3,4,5}; 가 있을 때,

cout<<Arr; 를 하게 될 경우 주소 값이 나왔다.

 

하지만 문자배열의 경우 주소값이 아닌 문자가 출력 되는 것을 볼 수 있다.

이는 cout에서 하는 일인데, 출력할 데이터가 char* 인 경우 해당 주소에 있는 문자를 출력하게 된다.

 

#문자열 상수

문자열 상수는 " "에 작성되어 있는 문자열을 문자열 상수라고 한다.

ex) "Hello", "World" etc.

문자열 상수는 Data영역에 배열형태로 저장이 되며, 문자열이 사용된 위치에 Data영역의 주소가 반환되어 사용이 된다.

 

즉 "Hello" 라는 문자열상수가 있으면, 이 상수는 Data영역에 배열로 저장이 되며 주소값을 반환한다.

그 주소값을 포인터에 저장할 수 있다.

char* ptr = "Hello";

이때 등록된 문자열 "Hello"는 상수화 되기 때문에 값 변경이 불가능하다.

예를 들면 위 포인터에서 *(ptr+1) = 'E'; 를 입력하면 오류가 난다.

 

문자열 상수의 경우, 주소값을 변경하는 것은 가능하다.

위에서 ptr은 "Hello"의 주소값을 가지고 있지만,

ptr="World"; 로 변경이 가능하다.

 

 

즉, 문자열 상수의 경우 const char* szBuff[10]=""; 인 경우와 같고

문자배열의 경우 char* const szBuff[10]=""; 인 경우와 같다

 

 

문자열을 입력 받을 경우 문자배열을 사용해야한다.

 

 

#문자열 함수

 

1. 문자열 복사

strcpy_s(복사 받을 곳, 얼마나 작업할지 bytes, 복사 할 것)

ex)

char szDst[10] = "";

char szSrc[10] = "Hello";

strcpy_s(szDst, sizeof(szDst), szSrc);

 

2. 문자열 결합

strcat_s(결합 받을 곳, 얼마나 작업할지 bytes, 결합 할 것)

ex)

char szDst[10] = "Hello";

char szSrc[10] = "World";

strcat_s(szDst, sizeof(szDst), szSrc);

 

3. 문자열 비교

두 문자열이 같은지 비교 (비교해서 같으면 0 반환, 다르면 그 외의 숫자)

strcmp(1번문장, 2번문장)

ex)

char szDst[10] = "Hello";

char szSrc[10] = "World";

if(!strcmp(szDst, szSrc))

cout<<"두문장이 같다"<<endl;

 

 

4. 문자열 길이( NULL 제외 )

strlen(문장)

ex)

char szDst[10] = "Hello";

cout<<strlen(szDst)<<endl;

 

출력값 => 5

728x90