C++기초

220325(3)_문자열(String)

hyrule 2022. 4. 5. 16:54
#include <iostream>

int main()
{
	//문자열 = 문자의 배열
	//이걸 활용해서 메모리 복사라는 매우 유용한 기능을 쓸 수 있다.

	//char: 1바이트를 차지하는 문자
	//wchar_t: 2바이트를 차지하는 문자(유니코드)
	//한글은 1글자당 2바이트를 차지하므로 char에 저장할때는
	//2개의 공간이 필요하다.

	//문자열의 끝은 0(널문자) 로 표현이 되어야 한다.

	//지금 당장은 char에 집중할 것임(많이 쓸 것이므로)

	char	Text[64] = {};
	//문자열도 마찬가지로 0으로 먼저 초기화를 해놓고 사용하는 것이 좋다.

	char	Text1[64] = "문자열입니다.";
	//이 문장을 저장하기 위해선 한글(2) * 6 + .(1) * 1 + 널문자(문장의 끝, 1) 해서
	//13바이트가 필요하다.
	std::cout << Text << std::endl;
	std::cout << Text1 << std::endl;


	//strcpy_s : 문자열 복사 함수
	//1번인자가 배열로 들어갈 경우 인자가 2개이다.
	//1번 인자에 2번인자에 들어간 문자열을 복사해주게 된다,
	//1번인자가 포인터일 경우 인자가 3개이다.
	//1번인자에 3번인자의 문자열을 2번인자의 크기만큼 복사해주게 된다.
	// 
	//예전에는 strcpy()를 사용했으나 안정성이 떨어지는 문제점이 있어 사용하지 않는다.
	//strcpy는 예전버전의 함수이기 때문에 가급적
	//strcpy_s를 사용해야 한다.
	strcpy_s(Text, "TestCopy");//첫 번째 인자로 배열을 주었을 경우
	std::cout << Text << std::endl;

	char* pText = Text;
	//strcpy_s(pText, 8, "다시 복사");
	//이렇게 복사해야할 문자열의 길이보다 공간이 작으면 에러가 발생한다.
	strcpy_s(pText, 10, "다시 복사");
	std::cout << pText << std::endl;


	std::cout << "문자열 리터럴" << std::endl;
	//Q)이렇게 리터럴 문자열을 출력시킬 때도 분명이 메모리 공간이 필요할 것이다.
	//그럼 이 문자열은 어디에 저장될까?
	//A)ro(읽기 전용) Data라는 메모리의 영역에 저장된다
	//문자열 리터럴은 const char*로 인식된다.

	//리터럴 문자열도 메모리에 저장되어 있으므로 물론 메모리 주소를 받아올 수 있다.
	const char* pText1 = "메모리 주소";
	std::cout << pText1 << std::endl;


	//strlen 함수를 이용해서 문자열의 수를 얻어올 수 있다.
	std::cout << "Count : " << strlen(pText1) << std::endl;
	//null문자를 제외한 실제 문자열 개수가 몇개인지를 얻어온다.


	//strcat_s : 문자열을 붙여주는 함수이다.
	strcat_s(Text, " 문자열 붙여보자.");
	std::cout << "문자열 붙이기 : " << Text << std::endl;


	//strcmp : 문자열 비교 함수이다.
	//문자열이 같을 경우 0을 반환 한다.
	//0이 아니면 다르다는 의미이다.
	if (strcmp(Text, "다시 복사 문자열 붙여보자."))
		std::cout << "두 문자열이 같다." << std::endl;
	else
		std::cout << "두 문자열이 다르다." << std::endl;


	//오늘의 숙제
	//strlen, strcpy_s, strcat_s, strcmp 직접 구현해 보자
	//참고)문자열의 끝에는 0('\0')이 나온다.



	//TIP)오버로딩 되어있는 함수일 경우 괄호 괄호 사이에서 위아래 화살표 키로 어떤 인자가 필요한지 확인할 수 있다.
	strcpy_s()

	return 0;
}