본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 10. C++ string

by 신림83 2020. 10. 15.
반응형

CPP 초급 강좌 10. C++ string

cpp가 지원하는 문자형 클래스 string에 대해 적어보자.

문자처리... 참 복잡하고 까다로운 부분이다. 가장 기본적인 내용들에 대해 여기서 적어본다.

 

cpp로 프로젝트를 진행한다고 해다, 이미 내부에 char형과 c 스타일을 문자처리 그리고 string 클래스를 혼용해서 사용하는 아름다운 프로젝트들이 많다. 그러므로 일단 c 스타일은 문자처리 코드를 좀 보자.

c 스타일을 문자열 처리 코드

#include <iostream>
using namespace std;

int main()
{
	char s1[256] = "안녕";
	const char* s2 = "HELLO";

	s1 = s2; //a

	if (s1 == s2) //b
	{
		cout << "같다." << endl;
	}
}

a, b 코드의 의도와 정상작동 여부에 대해 적어보자. 

a 코드는 아마도 s1에 HELLO가 대입되길 바랬겠지만 아쉽게도 s1은 아쉽게도 포인터 상수이다. 해당 코드는 error이다. 

b 코드의 의도는 값이 같은지 비교해보자 달라는 의미일 것인데, 해당 변수들의 주소 비교의 의미이다. 실 값의 비교가 아니다.

 

대입, 비교등  c에서의 문자처리는 모두 함수를 사용해야 한다. 수정해보자.

#include <iostream>
#include <cstring> //#include <string.h>
using namespace std;

int main()
{
	char s1[256] = "안녕";
	const char* s2 = "HELLO";

	//s1 = s2; //a
	strcpy(s1, s2); //a1

	//if (s1 == s2) //b
	if(strcmp(s1,s2) == 0) //b1
	{
		cout << "같다." << endl;
	}
}

a1에서 strcpy 라는 함수를 써야 위에서 기대하는 대입이 된다.

b1에서 strcmp의 결과값이 0일 때 동일한 문자라는 것이 검증이 된다.

 

이미 익숙한 사람들이 뭐야.. 이건 당연한 거라 생각하실수도 있겠지만, 일반적인 대입 연산자 =, 일반적인 비교 연산자 == 로 처리할 수 있으면 얼마나 좋을까?

 

*includ#include <cstring> //#include <string.h> 사용해야지만 해당 함수들이 동작한다. 왜 string.h가 아닌 cstring를 사용했는지를 모른다면 다음 링크를 참조하다.

 

관련링크

 

CPP 초급 강좌 3. C++ 해더 파일에 대해서 header files

CPP 초급 강좌 3. C++ 해더 파일에 대해서 header files c에서 cpp로 오면서 변경, 추가된 헤더 관련 이야기를 해보겠습니다. 이런 규칙으로 변경되었다 정도로 봐주세요 먼저 아래 예제를 보면 min 을 사

sillim83.tistory.com

해더 파일이름이 왜 그런지 궁금하면 보세요

c++ string

c++의 string 클래스에서는 각 연산자들의 사용이 가능해진다. string 클래스를 사용하여 위의 코드들을 변경해 보자.

#include <iostream>
//#include <cstring> //#include <string.h>
#include <string>
using namespace std;

int main()
{
	//char s1[256] = "안녕";
	//const char* s2 = "HELLO";

	string s1 = "안녕";
	string s2 = "HELLO";
	   	
	//strcpy(s1, s2); //a1
	s1 = s2; //a2
		
	//if(strcmp(s1,s2) == 0) //b1
	if (s1 == s2) //b2
	{
		cout << "같다." << endl;
	}
}

구 c 문자열 복사,비교등을 위해 include 했던 코드를 지우고 string를 추가했다.

 

string는 namespace std; 에 존재한다. using namespace std; 코드가 없다면 std::string 라고 호출해야 한다.

 

a2에서 대입이 정상 작동한다.

b2에서 비교가 정상 작동한다.

 

주석이 많아서 그렇지 코드도 훨씬 줄었다. 직관성이 올라갔다. 

 

주석을 지우고 다시 올려보자.

int main()
{
	string s1 = "안녕";
	string s2 = "HELLO";
	
	s1 = s2; //a2

	if (s1 == s2) //b2
	{
		cout << "같다." << endl;
	}
}

깔끔하다.

 

기존 프로젝트에서 char* 이용하여 아직 작업할게 남아 있을 수 있다 그럴 경우는 다음과 같이 처리하자.

string s1 = "안녕";
const char* s2 = s1.c_str();

아시죠?

반응형

댓글