2021년 12월 27일 월요일

STL, string

1. string 정의

string은 문자열을 좀 더 쉽게 다루기위한 STL 컨테이너 입니다.

 string은 STL 컨테이너는 아니지만 C++언어에 string을 편하게 다루는 방식이 있지 않다보니  많이 사용하게 됩니다.


2. string 사용법

string를 사용하기 위해서는 <string> 헤더를 인클루드 해야합니다. 

사용한 컴파일러 정보입니다.

g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=C:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/5.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-5.1.0/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: posix
gcc version 5.1.0 (tdm64-1)

생성하기

string s : 기본 생성자로 s 생성(초기화)

string s(str) : str 문자열로 s 생성

string s(p1, p2) : 포인터 구간 [p1, p2)의 문자로 s를 생성



3. 메소드 종류

+ 연산자, append() : 문자열 뒤에 붙이기

data() : 주소 획득

c_str() : \0 으로 끝나는 주소 획득

size() or length() : \0을 포함하냐 안하냐에 따라 다를 수 있지만 두개가 같다고 보면 됩니다. 

compare() : 스트링을 비교합니다.

s1 > s2 : 1

s1 < s2 : -1

s1 == s2 : 0

사용법 : s1.compare(s2)

(부분 비교도 가능)

copy() : 스트링 복사

s1.copy(buf, s1.length());

buf[s.length()] = 0; //\0을 복사하지 않으므로 0은 마지막에 넣어 줍니다.

find() : 검색

문자열에서 해당 문자/문자열의 위치를 반환. 없을 경우 string::npos, -1 반환

replace(시작위치, 길이, 교체문자열)

substr() : 스트링에서 부분 문자열을 추출

erase() : 문자열 지우기

insert() : 문자열에서 원하는 위치에 원하는 문자열 추가


4. 예제

4.1 대입

s=문자열


예제

#include <string>
#include <iostream> 

using namespace std;

int main()
{
	string str1,str2;
	const char *ptr1="abcdef";
	string str3(ptr1+1,ptr1+3);
	
	str1="abc";
	
	cout << "[" << str1 << "]" << "\n";
	//[abc]
	cout << "[" << str2 << "]" << "\n";
	//[]
	cout << "[" << str3 << "]" << "\n";
	//[bc]

	return 0;
}

결과

[abc]
[]
[bc]


4.2 문자열 붙이기

+ 연산자, append() 메소드

예제

#include <string>
#include <iostream> 

using namespace std;

int main()
{
	string str1,str2;
	const char *ptr1="abcdef";
	string str3(ptr1+1,ptr1+3);//[bc]
	str1="abc";//[abc]

	string str4;
	str4 = str1 + str3;
	str2.append(str1);
	str2.append(str3);
	
	cout << "[" << str2 << "]" << "\n";
	cout << "[" << str4 << "]" << "\n";
	
	return 0;
}

결과

[abcbc]
[abcbc]


4.3 데이터 가져오기/접근하기

string은 \0(null)을 가지고 있을 수 있기 때문에 두가지 메소드가 준비가 되어있습니다.

data() : 포인터 획득

c_str() : \0 으로 끝나는 포인터 획득

이중 c_str()은 printf/scanf등에서 사용가능한 형태의 함수가 됩니다.

예제

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

int main()
{
	string str1,str2;
	const char *ptr1="abcdef";
	string str3(ptr1+1,ptr1+3);//[bc]

	printf("%s\n",str3.data()); // Wrong
	printf("%s\n",str3.c_str()); // Right
	
	return 0;
}

위 예제에서 str3.data() 이 부분은 잘못된 사용이 됩니다. 왜냐하면 printf 는 \0을 만날때 까지 출력하는 함수이기 때문입니다. 그렇치만 결과는 제대로 나올 수 있습니다.

결과

bc
bc

포인터 주소를 알았으니 조작하는건 일도 아닐겁니다. 하지만 string 은 주소가 변할 수 있다는점 명심하시기 바랍니다. 즉 이번에 획득한 c_str()의 주소가 다음번 획득한 주소와 다를 수 있습니다. 이것은 string STL에서 새로운 문자열이 할당이 이뤄질때 remalloc이 일어나기 때문입니다.


4.4 문자열 찾기/바꾸기

find()

문자열에서 해당 문자/문자열의 위치를 반환. 없을 경우 string::npos, -1 반환

replace(시작위치, 길이, 교체문자열)

예제

#include <string>
#include <iostream> 

using namespace std;

int main()
{
    string str("Hello World!!");
    string str2("Wor");
 
    size_t found = str.find(str2);
    if (found != string::npos)
        cout << "first 'Wor' found at: " << found << '\n';

    str.replace(str.find(str2), str2.length(), "XXX");
    cout << str << '\n';

    return 0;
}

결과

first 'Wor' found at: 6
Hello XXXld!!



댓글 없음:

댓글 쓰기