36-2-마.삽입과 삭제

다음은 문자열 중간에 다른 문자 또는 문자열을 삽입하는 insert 함수에 대해 알아보자. 삽입 대상을 다양하게 지정할 수 있으므로 여러 벌의 함수가 준비되어 있다.

 

string& insert(size_t pos, const char* ptr);

string& insert(size_t pos, const char* ptr, size_t count);

string& insert(size_t pos, const string& str);

string& insert(size_t pos, const string& str, int off, int count);

string& insert(size_t pos, int count, char ch);

void push_back(char ch);

 

삽입 동작은 문자열에 내용을 추가하는 append와 유사하되 다만 삽입하는 지점을 인수로 전달한다는 것만 다를 뿐이다. 그래서 모든 insert 함수의 첫 번째 인수는 삽입 지점을 가리키는 pos이다. 어떻게 보면 append 함수를 문자열 끝에 삽입하는 함수라고 볼 수도 있으므로 append는 첫 번째 인수가 size()인 insert라고 할 수 있다.

삽입할 수 있는 대상은 문자열 상수, string 객체, 연속적인 동일 문자이되 대상의 일부분만 원하는 길이만큼 삽입할 수도 있다. 함수의 원형으로부터 인수의 의미는 쉽게 유추 가능하다. off가 대상의 시작 위치이며 count가 삽입할 문자의 개수이다. push_back 함수는 문자 하나만 제일 끝에 추가하는 함수인데 STL형식의 함수를 string 객체에 정의해 놓은 것이다. 다음은 문자열의 일부를 삭제하는 함수이다.

 

string& erase(size_t pos=0, size_t count=npos);

 

삽입에 비해 삭제는 다른 대상과 상관없이 자기 자신의 일부를 지우는 것이므로 구조가 훨씬 더 간단하다. pos 위치에서 count 개수만큼의 문자가 삭제된다. 이 함수 외에 STL의 반복자를 인수로 취해 일정 범위를 삭제하는 원형도 있다. 다음 예제로 삽입, 삭제 함수를 테스트해 보자.

 

: stringinsert

#include <Turboc.h>

#include <iostream>

#include <string>

using namespace std;

 

void main()

{

     string s1("1234567890");

     string s2("^_^");

 

     cout << s1 << endl;

     s1.insert(5,"XXX");

     cout << s1 << endl;

     s1.insert(5,s2);

     cout << s1 << endl;

     s1.erase(5,6);

     cout << s1 << endl;

}

 

1~0까지의 숫자로 구성된 s1문자열에 다른 문자열을 삽입 및 삭제해 보는 예제이다. 실행 결과는 다음과 같다.

 

1234567890

12345XXX67890

12345^_^XXX67890

1234567890

 

길이 3의 문자열을 두 번 삽입하고 여섯 문자를 삭제했으므로 결국 원본 문자열과 같아진다. 다음은 문자열의 일부를 다른 내용으로 바꾸는 대체 함수에 대해 알아보자. 총 10개의 함수가 중복 정의되어 있는데 비슷 비슷하므로 대표적으로 다음 함수 하나만 알아 두면 된다.

 

string& replace(size_t pos, size_t num, const char *ptr);

 

pos위치에서부터 num개까지의 문자열을 ptr로 대체한다. 나머지 함수는 string객체를 인수로 취하거나 대체하는 문자열의 일부만을 취하는 식인데 레퍼런스를 참고하기 바란다. 다음은 테스트 예제이다.

 

: stringreplace

#include <iostream>

#include <string>

using namespace std;

 

void main()

{

     string s1="독도는 일본땅";

 

     cout << s1 << endl;

     s1.replace(7,4,"대한민국");

     cout << s1 << endl;

}

 

s1은 말도 안되는 거짓말인데 이 문자열의 7번째 위치에서 길이 4만큼인 "일본"을 "대한민국"이라는 문자열로 대체했다. 실행 결과는 "독도는 대한민국땅"이 된다. 이 예에서 보다시피 대체되는 문자열이 원본 문자열과 길이가 꼭 같지 않아도 상관없다. 더 긴 문자열이나 더 짧은 문자열로 대체하는 것도 가능한데 이때 늘어나는 메모리는 자동으로 관리되며 뒤쪽 문자열도 알아서 이동한다. 다음 함수는 string 객체의 일부 문자열을 추출하여 새로운 string 객체를 생성한다.

 

string substr(size_t off=0, size_t count=npos); const;

 

off 위치에서부터 count 개수만큼의 부분 문자열을 추출하여 새로운 string 객체를 만들며 원본 객체는 건드리지 않는다. 이 함수를 사용하면 부분 문자열로 구성된 string 객체를 만들 수도 있다.

 

: substr

#include <iostream>

#include <string>

using namespace std;

 

void main()

{

     string s1("123456789");

     string s2=s1.substr(3,4);

 

     cout << "s1:" << s1 << endl;

     cout << "s2:" << s2 << endl;

}

 

s1의 3번째에서부터 길이 4만큼의 부분 문자열을 취해 s2에 대입했으므로 s2는 "4567"로 초기화된다.