티스토리 뷰

IT/C, C++

[C++][string] 문자열 양끝에 0 지우기 (find_first_not_of, find_last_not_of)

주인장 진빼이

공통된 숫자나 00000 같이 일렬로 나열된 숫자에 대해서 생략이 필요할 때가 있다.

 

0이 아닌 맨 처음이나 맨 끝이 숫자로 시작되는 인덱스를 구해야할 필요가 있다면

string에 포함된 find_first_not_of, find_last_not_of 함수를 사용해보도록 하자

 

이 함수를 응용하여 문자열 맨끝에 0이 줄줄이 있거나, 또는 문자열 맨 처음에 0이 줄줄이 있는 경우 공통된 숫자를 생략 및 제거할 수 있다.

 

 

두 함수(find_first_not_of, find_last_not_of)에서 생략할 값들을 인자로 넘겨주면 된다.

문자열 맨 끝에 있는 11111을 지우고 싶다면 char '1' 을 넘겨주면 된다.

 

함수의 반환값은 두 함수마다 약간의 차이가 존재하니 아래에서 자세히 알아보도록 하자

 

find_first_not_of 함수

find_first_not_of 함수는 first부터 string의 length-1까지 0이 아닐 때 까지의 인덱스를 구해주는 함수이다.

" 1509 " 라는 문자열이 있으면 find_fist_not_of 함수는 2를 반환하는 것이 아니라 0을 반환한다. (찾지못했단 의미이다)

맨 첫번째에 0이 없기 때문에 함수는 종료되는 것이다.

 

" 01509 " 라면 반환값은 1이 된다. 즉, start at은 1이다. index라는 개념보다 길이의 개념으로 익혀두도록 하자.

이를 이용해서 다음과 같은 코드를 사용하여 0을 생략할 수 있다.

vector<string> front_zero_list;
front_zero_list.push_back("00001509");
front_zero_list.push_back("0001509");
front_zero_list.push_back("001509");
front_zero_list.push_back("01509");
front_zero_list.push_back("1509");

int front_not_zero_pos = -1;
for (string element : front_zero_list)
{
    front_not_zero_pos = element.find_first_not_of('0');
    if (front_not_zero_pos != 0)
        element.erase(0, front_not_zero_pos);

    cout << element << "\n";
}

//==== Erase, not of 0
element.erase(0, element.find_first_not_of('0'));
//==== Console Output =====
1509
1509
1509
1509
1509

 

if문을 이용하여 찾지 못한 경우 erase를 하지 않도록 조건문을 걸어두었지만 erase 내부함수에서도

range를 체크하기 때문에 필요 없다고 볼 수 있다. (range: 0, 0)

 

 

반대로 뒤에 0000이 줄줄이 붙어 있고

앞에서는 1509라는 숫자가 존재한다면 find_last_not_of 함수를 이용하여 뒤에 줄줄이 붙은 0을 모두 제거할 수 있다.

find_last_not_of 함수

find_last_not_of 함수는 string의 length-1부터 first까지 찾아 0이 아닐 때 까지의 인덱스를 반환한다.

인덱스는 요소의 위치를 의미하는데 last, first 함수와 관계없이 stat at은 0이다.

 

예시를 보자.

" 1509 " 뒤에서부터 제거할 아무 숫자가 없다면 문자열 길이의 -1만큼 반환이 된다. 즉 3이 반환된다.

" 15090 " 맨 뒤에  0이 새로 생겼다. 이때 0이 아닐때 까지의 인덱스는 3이므로 3이 반환이 된다.

" 150900 " 맨 뒤에서부터 찾아 0이 아닐때 까지의 인덱스는 3이므로 3이 반환이 된다.

" 015090 " 맨 앞에 0을 넣었다. 0이 아닐 때 까지의 인덱스에 해당하는 요소값인 9의 위치가 변경되었으므로 4가 반환이 된다.

 

find_last_not_of 함수는 앞에 0이 추가로 생기지 않는한 인덱스는 고정되어 있다고 볼 수 있다.

다음과 같은 코드를 이용하여 맨 뒤에 0을 모조리 제거할 수 있다.

vector<string> back_zero_list;
back_zero_list.push_back("15090000");
back_zero_list.push_back("1509000");
back_zero_list.push_back("150900");
back_zero_list.push_back("15090");
back_zero_list.push_back("1509");
int back_not_zero_pos = -1;
for (string element : back_zero_list)
{
    back_not_zero_pos = element.find_last_not_of('0');
    if (back_not_zero_pos != (element.length()-1))
        element.erase(back_not_zero_pos+1, element.length()-1);

    cout << element << "\n";
}

//==== Erase, not of 0 ====
element.erase(element.find_last_not_of('0')+1, element.length()-1);
//==== Console Output =====
1509
1509
1509
1509
1509

find_first_not_of 함수와 마찬가지로 조건문을 검사하지 않고 한줄로 대체할 수 있다.

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함