알고리즘 테스트를 보다보면 각각 회사마다 다른 유형을 볼 수 있다. S사 같은 경우에는 BFS, DFS, DP 그리고 K사 또는 N사는 string 값을 이용하여 알고리즘 대입..
17년 하반기 이후로 코딩 테스트를 C++언어로 보고 있는데 문자열과 관련된 내용이 나오면 C++을 선택한 것이 후회할 때가 있다.
예를들어 어느 문자열이 주어졌고 공백을 기준으로 잘랐을 때 Java 언어는
String strinput ="Hi Hello Erjuer01!";
String strinputarray[] = strinput.split(" ");
/*
strinputarray[0] = "Hi"
strinputarray[1] = "Hello"
strinputarray[2] = "Erjuer01!"
*/
로 split 메소드를 이용하여 쉽게 자를 수가 있었는데, C++ string 라이브러리의 strtok 메소드를 활용하려고 보니 char* 이라는 매개변수가 등장하게 되고 이와 유사한 char[], string 변수와의 차이점을 정리하여 C++로 쉽게 문자열을 다룰 수 있도록 공부해보려고 한다.
char
우선 char라는 변수 선언부터 언급해야 하는데 char은 문자라는 1-byte의 변수이다. 즉 단어 하나를 뜻하는 것이며 더 나아가 2-byte인 한글과는 문자 길이가 맞지 않아 깨진 것을 확인 할 수 있다. 또 char값에 정수를 대입해도 정수로 받아 들이는 것이 아닌 ASCII 코드로 해석한다.
char a = 65;
cout<<"a의 값은 : " <<a<<endl;
/*
출력
a의 값은 : A
*/
<출력의 예시>
Char*
char*는 문자열을 나타내는 것이며 글자 여러개가 계속 이어진 값을 가질 수 있다. 문자의 포인터 변수는 문자열을 담기 위해 사용한다.
char * str ="가나다라마바사" 일 때 포인터가 변수는 첫 글자 이자 문자열의 시작 주소(가나다라마바사에서 '가')를 가리킨다.
또한 문자열 끝의 경우에는 마지막 지정 문자가 들어간다.
char* p ="abcd";
cout<<p[0]<<endl;
cout<<p[1]<<endl;
cout<<p[2]<<endl;
cout<<p[3]<<endl;
cout<<p<<endl;
cout<<p+1<<endl;
cout<<p+2<<endl;
cout<<p+3<<endl;
/* 출력
Error
Error
Error
Error
abcd
bcd
cd
d
*/
더 나아가 char*은 포인터 변수 이므로 직접적인 변수에는 접근 및 수정할 수 없고 읽을 수만 있다.
p[0], p[1]와 같이 직접 접근은 실행 시 오류 발생 할 것이고 p+1, p+2 같은 경우에는 시작점이 a에서 b 그리고 c로 포인터 변수의 시작 주소가 바뀌는 것 이기 때문에 문자가 하나하나 줄어들며 출력이 된다.
char[]
char*와 같이 문자열을 나타내는 것은 똑같으나 포인터 변수가 아닌 배열을 통해 나타내는 것이다. 즉 주소값에 대해서 접근하는 것이 아니기 때문에 char*와 큰 차이점은 문자열 하나하나 수정이 가능하다는 점이다. 여기서도 문자열을 5개로 선언한 이유는 끝에 마지막 지정 문자가 들어가기 때문이다.
또한 char[] 선언에서는 꼭 크기를 정해주어야 한다.
char p[5] ="abcd";
cout<<p<<endl;
p[2]='z';
cout<<p<<endl;
/*출력
abcd
abzd
*/
/*
p[4] ="abcd"일 때에는 error: initializer-string for array of chars is too long [-fpermissive] 길이가 맞지 않는 에러가 발생한다.
*/
string
char[]은 struct를 사용하고 string은 class의 객체이다. 그렇기 때문에 string을 활용하기 위해서는 #include<string.h> 라이브러리를 include하여 사용해야 하고 cout을 통해 출력되는 결과물이 같더라도 각각 변환을 위해서는 생성자나 메소드를 활용해야 한다.
확실한 차이점이라면
char[] str일 경우 해당 배열의 크기는 strlen(str), string str 경우에는 str.size()이고 char[]에서는 사용할 수 없었던 문자열 처리를 쉽게 할 수 있도록 도와준다.
string tempstr ="c++ 알고리즘이 재밌다!";
string tempstr2 ="Java 알고리즘이 재밌다!";
tempstr2 = tempstr; // tempstr2는 c++ 알고리즘이 재밌다로 덮어쓰기 된다.
string str = tempstr+" 그리고 "+ tempstr2; // c++ 알고리즘이 재밌다! 그리고 java 알고리즘이 재밌다!
와 같은 수식 기호를 이용해 나타 낼 수 있다. 그 외에에도 string 라이브러리 안의 find, substr 같은 어떠한 문자열을 찾거나 잘라낼 때 도움이 되는 함수들이 많다.
다음 포스팅에는 char를 활용한 문자열 자르기 및 복사 그리고 char[] <-> string 변환에 대해서 정리해보자.
끝.
'개발 지식 > C++' 카테고리의 다른 글
[C++] cout cin namespace overloading 접해보기 (0) | 2021.10.16 |
---|
댓글