본문 바로가기
C & C++

C++ string 정리

by 2Plus 2020. 6. 7.

Photo by Alfons Morales on Unsplash

 

 예전 블로그에서 작성했던 C++ String 정리에 대한 글을 다시 약간 정리만 하여 옮겨 작성한다. 코드를 복사하고 싶은 경우에는 각 코드 하단의 example.cpp를 클릭하면 복사가 가능하니 참고 바란다.

 

 

 먼저, C++에서 사용할 수 있는 String에 대해 기본적인 기능과 동작들을 알아보기 위해 위와 같이 테스트 함수를 13개 만들었다. 아래에서 각각의 함수 구현과 설명에 대해 정리해두었으니 각 기능에 대해 알아보면 된다.

 

 

1 -  string의 기본적인 입출력 기능

[Code]

 

 

[결과]

 

 

 다른 변수들을 선언하듯이 string 변수를 선언하고 cin으로 입력받고, cout으로 출력할 수 있다. endl은 '\n'(줄바꿈)과 같은 의미라고 생각하면 된다. 위와 같이 ">>" 나 "<<"를 이용하여 해당 방향으로 입력하거나 출력하는 것으로 이해하면 된다.

 

 테스트를 위해 입력으로 "TestInput"을 입력하였고, 입력해준 문자열이 str에 저장되었다가 cout을 통해 출력되는 것을 결과에서 확인할 수 있다.

 

 

2 - string 생성 및 초기화

[Code]

 

 

[결과]

 

 

 위와 같이 간단하게 초기화하여 사용할 수 있는 방법은 3가지가 있다. str3와 같이 다른 string의 값으로 초기화를 할 수 있는 방법도 있다.

 

 

3 - string에 문자 또는 문자열 추가

[Code]

 

 

[결과]

 

 

 string에 문자나 문자열을 추가하는 방법은 두 가지가 있다. 위의 예시 코드처럼 "+" 연산자를 사용하거나 append() 함수를 사용할 수 있다. append() 함수는 문자열의 뒤에 인자로 받은 문자열을 추가해주는 역할을 수행한다. 코드와 실행 결과를 보면 쉽게 이해할 수 있다.

 

 

4 - string의 길이 구하기

[Code]

 

 

[결과]

 

 

 string의 길이는 size()나 length() 함수를 호출하여 얻을 수 있다. 큰 차이는 없고, 문자열의 길이를 얻을 수 있는 같은 역할을 한다고 생각하면 된다.

 

 

5 - char 배열(C에서의 string)로부터 string 생성하기

[Code]

 

 

[결과]

 

 

 C언어에서는 string 타입이 따로 존재하지 않기 때문에 char 배열을 통해서 string을 표현한다. 이러한 char 배열로부터 C++의 string을 만드는 방법은 위와 같다. 이때 주의할 점은 C언어에서 char 배열로 string을 표현시 배열의 마지막에 '\0'을 꼭 넣어주도록 되어 있기 때문에, string으로 변환시에도 해당 내용을 바탕으로 변환이 된다. 그렇기 때문에 배열의 마지막에 '\0'이 없는 경우에는 string으로의 변환이 제대로 동작하지 않는다. 위의 결과와 같이 정상적이지 않은 string char 배열을 반환하였을 때, 변환이 이상하게 되는 것을 확인할 수 있다.

 

 

6 - string의 동적 생성 및 반환

[Code]

 

 

[결과]

 

 

 string은 동적 생성과 반환이 가능하다. new 키워드를 이용하여 위와 같이 동적 생성을 할 수 있다. 이때 주의할 점은 str은 주소를 저장하고 있기 때문에 위와 같이 그냥 출력하면 주소가 출력된다. 또 이러한 경우에 append()와 같은 함수를 사용하는 경우 "."이 아니라 "->"를 사용해줘야 한다. 사실 이 부분은 string에 따른 내용이 아니라 포인터에 관한 내용이다. 주의해서 사용하도록 하자.

 

 

7 - string을 한 줄 전체로 입력받기

[Code]

 

 

[결과]

 

 

 일반적인 방법으로 string을 입력받는 경우, 띄어쓰기가 있으면 그 앞까지만 입력 받는다. 띄어쓰기가 포함된 문자열을 입력받아야 하는 경우라면 getline()을 이용하면 된다. getline()을 이용하여 위의 예시 코드와 같이 지정을 해주면 엔터('\n')가 나올 때까지 입력된 문자열을 한번에 입력받을 수 있다.

 코드를 살펴보면 입력 버퍼를 초기화하는 부분이 있다. 이는 입력받을 때 버퍼로 인해 의도하지 않은 입력이 되는 것을 방지하기 위해 작성한 부분이다. getline()에서 '\n'이 입력될 때까지 문자열을 입력받도록 지정을 했는데, 만약에 그 앞 부분에서 cin >> str 과 같은 형태로 입력을 받았다면, 입력 버퍼에는 '\n'이 그대로 남아 있다. 이 상태에서 getline()을 호출하면 실제로 입력을 하지 않았어도 입력 버퍼에 있는 '\n'을 인식하여 빈 문자열을 받고 해당 코드 라인이 넘어가게 된다. 이를 방지하기 위해 위와 같이 버퍼에 남은 '\n'을 비워주도록 하였다.

 

 

8 - string 중 특정 위치의 문자 가져오기

[Code]

 

 

[결과]

 

 

 at()을 사용하면 해당 인덱스에 있는 문자를 char 형태로 반환받을 수 있다. 이때, 인덱스는 0부터 시작한다.

 

 

9 - string 간 문자열 비교하기

[Code]

 

 

[결과]

 

 

 compare()를 사용하여 문자열을 비교할 수 있다. compare()는 int 값을 반환해준다. -1이면 사전적으로 더 앞에 있는 것이고, 0이면 완전히 동일한 문자열, 1이면 사전적으로 더 뒤에 있는 것이다. 예시 코드를 참고 바란다.

 

 

10 - string 복사

[Code]

 

 

[결과]

 

 

 위와 같이 "=" 연산자를 통해 string을 복사할 수 있다. 이때 포인터 값만 복사되는 것이 아니라, 안의 값이 복사되고 새로운 객체가 만들어지게 된다. 복사하여 str1의 뒤에 문자열을 더 추가해보았다. 실제로 새로운 객체가 만들어진 것임을 결과에서 확인할 수 있다.

 

 

11 - string 중간에 문자열 추가 및 검색

[Code]

 

 

[결과]

 

 

 find()를 사용하여 string 안에 해당 문자열이 있는지를 확인할 수 있다. 만약에 해당 문자열이 없을 경우에는 string::npos를 반환한다. 문자열이 있는 경우에는 해당 문자열이 시작하는 인덱스를 반환한다. find()의 인자로 찾을 문자열만 주는 경우에는 문자열의 시작 부분부터 검색을 하고, 두 번째 인자로 검색을 시작할 인덱스 값을 지정해 줄 수도 있다.

 

 

12 - substring

[Code]

 

 

[결과]

 

 

 substring은 문자열 내에서 시작 인덱스와 끝 인덱스를 지정하여 부분 문자열을 반환해준다. message를 검색하여 message 이후의 문자열만 저장하고 이를 출력하도록 테스트 코드를 작성하였다.

 

 

13 - string과 숫자 간 변환

[Code]

 

 

[결과]

 

 

 개발을 하다 보면 문자열과 숫자를 서로 변환할 일이 자주 있다. C언어에서는 보통 atoi, iota, atof, ftoa 등을 사용했지만, C++에는 string이 있기 때문에 stoi(string to integer), stof(string to float) 등을 사용할 수 있다. 숫자를 문자열로 변환할 때는 모두 위와 같이 to_string ()만 사용하면 된다. 더 편리하다.

 

 

반응형

댓글