알고리즘

[C++] string 내장 함수 : find, npos, substr, erase, to_string, stoi, isdigit, isalpha, tolower/toupper

히똔 2022. 4. 7. 16:38
728x90
반응형

글쓴이는 코딩테스트를 위한 준비로 C++ 공부를 하고 있으며,
다음 내용은 글쓴이가 자주 헷갈리는 string 함수만 정리해 놓은 것임을 알립니다!

 

앞으로 이야기할 함수들은 모두 헤더파일 string에 있는 아이들이다.

#include <string>

 

.find()


int findPos = input.find(cmp,pos);

pos의 위치부터 cmp 문자열을 찾아서 발견 index값을 리턴해주는 메서드다.

 

cmp("123")가 temp에 몇개 있는지 세는 알고리즘이다.

string temp = "12345671234567";
string cmp = "123";

int cnt=0;
int pos=0;
while(1){
    int findPos = temp.find(cmp,pos); //pos값이 계속 바뀌면서 cmp를 찾는다.
    if(findPos == temp.npos) break; //더 이상 cmp 없을때 반복문 빠져나온다.
    
    cnt++;
    pos = findPos+1; // 다음 위치부터 찾아야 하기 때문에 +1 해준다.
}
cout<< cnt;

 

.npos

find를 하다보면 npos가 나올 수 밖에 없다.
find에서 값을 못찾을때 npos가 리턴된다.
상수 -1로도 통한다.

 

 

.substr()


문자열을 자르는 메서드로 substring가 아니다..!!!!!

string temp="123456789";
string next=temp.substr(pos,cnt);

temp 문자열을 pos 인덱스 위치부터 cnt 개수만큼 잘라서 문자열을 리턴해주는 메서드다.

next = temp.substr(2,5); //34567

위와 같은 코드라면 temp에서 2번위치부터 5개를 뽑는 코드이다.
즉, 3부터 5개로 "34567"

 

 

.erase()


문자열 사이를 지워준다.

string temp="123456789";
temp.erase(2, 5);
cout << temp; // 1289

temp 문자열을 pos 인덱스 위치부터 cnt 개수만큼 버린다.

언뜻보면 위 substr() 메서드와 같은 맥락인 것 같아보이지만 크게 다른 점이 있다.

erase 메서드는 string 자신에게 적용된다. (원본손상)
반면 substr을 이용하면 원본은 유지되고, 잘린 문자열을 리턴해주기 때문에 다른 string에 할당에 주어야한다. 

 

 

to_string()


string형으로 변환해주는 함수

이건 함수인지 메서드인지 헷갈리기도 하고,
이름도 tostring인지 tostr인지 자주 헷갈려서 매번 다시 찾아보게 되는 함수다..

함수!! 며 to_string으로 언더바가 있다는거 기억 꼬오오옥!!! 하기~

cout<<to_string(123); // "123"
cout<<to_string(123.567); // "123.567000"

사용법은 쉽다. 인자는 int형이든 double형이든 어떤 것이든 상관없다.

 

 

stoi()


C언어 에서는 char to int 로 atoi를 이용한다..
그거랑 가끔 헷갈림.. 

stoi는 string to int 이다!! 쪼잔하게 C처럼 한글자씩 안해도 된다!! 매우 편리한 것 ^-^

int number = stoi("1"); // number = 1;

 

isdigit()

근데 만약 인자로 숫자형태가 아닌 string이 들어간다면 오류가 난다.
그러니까 꼭 isdigit()로 숫자형인지 확인해줘야한다.
근데 얘는 ctype.h 에서 나온애라 쪼잔하게 char형만 확인가능하다.

이것도 함수! 라는것 기억하기!!!

string str="1";
if(isdigit(str)){ //숫자면 1, 숫자아니면 0
    cout<< stoi(str);
} else {
    cout<<"숫자 아님";
}

isdigit()과 같은 맥락의 함수로 isalpha()가 있다. 이건 알파벳인지 확인해주는 함수.
사용법은 isdigit과 같으니 별도로 적지 않겠다.

 

 

tolower() / toupper()


하.. 이것도 함수인지 메서드인지 헷갈린다.. 함수라는 것 명심~!!!
to_lower 아니고 붙혀서 쓰는것도 명심..!! 언더바 없다구 ㅠㅠㅠ

이 친구도 ctype.h 에서 온 애라 char형만 가능하다. 

string 에다가 적용하고 싶을 경우 이렇게 쓴다.

string data = "HELLO";
transform(data.begin(), data.end(), data.begin(), tolower);
cout << data; // "hello"

 

728x90
반응형