이 글에서는 C++에서 문자열에 포함된 앞자리 0(선행 0)을 제거하는 방법을 알아봅니다. 실제 개발에서는 "00023054"처럼 숫자 문자열 앞에 불필요한 0이 붙어 있는 경우가 종종 발생합니다. 프로그램을 실행하면 "23054"만 남게 되어, 맨 앞의 모든 0이 깔끔하게 제거됩니다.
입출력 예시
입력: 앞자리 0이 포함된 문자열 "000023500124" 출력: "23500124"
알고리즘
전체 로직은 매우 단순합니다. 다음 네 단계로 구성됩니다.
1단계: 문자열을 입력받는다. 2단계: 앞자리 0의 개수(n)를 센다. 3단계: 문자열 시작 부분에서 n개의 문자를 제거한다. 4단계: 나머지 문자열을 반환한다.
예제 코드
아래 코드는 반복문으로 0이 아닌 첫 번째 문자의 위치를 찾은 뒤, erase() 함수를 사용해 그 앞부분을 잘라내는 방식입니다.
#include<iostream>
using namespace std;
int main() {
string my_str = "000023500124";
int num = 0;
cout << "원본 문자열 :" << my_str << endl;
// 문자열 앞부분의 0 개수 세기
while(my_str[num] == '0') {
num++;
}
my_str.erase(0, num); // 인덱스 0부터 num개의 문자 제거
cout << "0 제거 후 문자열 :" << my_str;
}실행 결과
원본 문자열 :000023500124 0 제거 후 문자열 :23500124
코드 동작 원리
1. while(my_str[num] == '0') 조건은 문자열을 처음부터 한 글자씩 검사하여, 0이 아닌 첫 번째 문자를 만나면 반복을 멈춥니다.
2. my_str.erase(0, num)은 인덱스 0부터 시작해 num개의 문자를 삭제합니다. 즉, 앞자리 0 전부가 한 번에 제거됩니다.
3. 만약 문자열 전체가 "0000"처럼 0으로만 이루어져 있다면 위 코드는 빈 문자열을 반환할 수 있으므로, 필요하다면 예외 처리를 추가하는 것이 안전합니다.
더 간결한 대안: find_first_not_of 활용
C++ 표준 라이브러리의 find_first_not_of()를 사용하면 같은 작업을 한 줄로 처리할 수도 있습니다.
string removeLeadingZeros(const string& str) {
size_t pos = str.find_first_not_of('0');
if (pos == string::npos) return "0"; // 전부 0인 경우
return str.substr(pos);
}이 방식은 별도의 반복문 없이 0이 아닌 첫 번째 문자의 위치를 바로 찾아주기 때문에 코드가 더 짧고 가독성이 좋습니다. 상황에 맞는 방법을 선택해 사용하면 됩니다.