[C++] std::string

spring·2020년 11월 9일
0

1. 문자열의 뒤에서 부터 검색

종종 우리는 어떤 파일이 어떤 디렉토리에 존재 하는지 알 필요가 있다.
string::substr 함수를 통해 0번째부터 마지막에 나오는 '/' 까지 자르면 된다.

마지막에 나오는 '/' 의 위치를 알기 위해 뒤에서 부터 검색하는

string::find_last_of 라는 메소드가 존재한다.

/\ 둘다 찾아준다.

string str = "C:/Users/kimbom/Desktop/태깅연습/103827_4_연미지128.jpg";
//C:/Users/kimbom/Desktop/태깅연습
string path = str.substr(0, str.find_last_of("/\\"));
//103827_4_연미지128.jpg
string file = str.substr(str.find_last_of("/\\")+1,str.length());

2. 확장자 추출

_splitpath 라는 함수가 있지만, C언어 용이라 인수들이 전부 char* 이다.

std::string 을 이용한 고급진 기법이 있다. 앞서 말한 1번과 비슷하다.

std::string::size_type dot = filename.find_last_of('.') + 1;
std::string ext = filename.substr(dot, filename.length() - dot);

'.' 의 위치+1 부터 끝까지 찾으면 된다.

만일 확장자가 없으면? string::find_last_of 메소드는 실패시 string::npos를 반환하는데

이 값의 자료형은 size_t 이고 해당 자료형에서 가장 큰 값을 리턴한다.

그 값에서 1을 더했으므로 첫번째 인수는 0이되고, 즉 확장자가 없을경우에는 원본 문자열이 그대로 나오는 것이다.

참고로 x86 머신에서 size_t 는 4바이트 부호없는 정수, x64 머신에서는 8바이트 부호없는 정수이다.

3.순수 파일(확장자 없는) 이름 알아오기

std::string GetPureNameOfFile(std::string filename) {
	std::string::size_type slash = filename.find_last_of("/\\");
	std::string::size_type dot = filename.find_last_of(".");
	if (dot == std::string::npos) {
		dot = filename.length();
	}
	std::string pure = filename.substr(slash+1, dot - slash-1);
	return pure;
}

4.특정 문자 제거

char r='\t';
str.erase(std::remove(str.begin(), str.end(), r), str.end());

5.파일 통채로 읽기

std::ifstream fin;
fin.open(path, std::ios::in);

std::string str;
str.assign(std::istreambuf_iterator<char>(fin),std::istreambuf_iterator<char>());

물론 assign메소드 대신 std::string::(constructor) 으로 사용이 가능하다.

6.자리수 지정 숫자

int n=7;
std::ostringstream oss;
oss.width(4);    //출력폭을 어떻게 할 것인지?
oss.fill('0');   //남는폭을 무엇으로 채울 것인지?
oss << n;
0007

std::ostream::widthstd::ostream::fill은 일회성 함수이다.

7.string tokenizer

std::string basic_str = "*.cpp;*.h;*.c;*.jpg;";
std::string token = ";";
std::vector<std::string> word_list;
std::string::size_type offset = 0;
while (offset<basic_str.length()){
	std::string str = basic_str.substr(offset, basic_str.find(token, offset) - offset);
	word_list.push_back(str);
	offset += str.length() + 1;
}

간단하게 허용 확장자 리스트에서 각 확장자를 ;를 기준으로 잘라내는 과정이다.

8. 대소문자 변환

string s;
transform (s.begin(), s.end(),  s.begin(), tolower);                 
transform (s.begin(), s.end(), s.begin(), toupper);

3번째 인수는 목적지로써 std::copy 와 비슷하게 사용할 수 있다.

9. chomp(문자열 뒤의 white space 지우기)

std::string s = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\t\n";
std::string m = s.substr(0, s.find_last_not_of("\n\t ")+1);

find_last_not_ofstd::string::npos를 반환하더라고 npos에 1을 더하면 size_t 오버플로우가 나서 0이 된다. 그런데 find_last_not_of가 npos가 나온다는것은 모두 white space임을 뜻하므로 모든 스트링을 지워야 한다. 그러므로 호출되는 s.substr(0,0)은 올바른 동작이므로 위 코드는 예외처리가 필요없다.

10. replace substring all

std::string text_msg = "hello\\nworld\\nspring";
std::string from = "\\n";
std::string to = "\n";
while(text_msg.find(from)!=text_msg.npos)
    text_msg.replace(text_msg.find(from), from.length(), to);
std::cout << text_msg << std::endl;

가장 깔끔하게 함수를 따로 만들지 않고 내부 문자열을 다른 문자열로 교체할 수 있다.

profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글