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!!
댓글 없음:
댓글 쓰기