공백은 출력 시 잘 안 보이기 때문에 '_'로 대체했다.
처음으로 공백이 아닌 지점을 찾아 좌측 공백을 없앤다.
string ltrim(string s)
{
string t = "";
bool bFinished = false;
for (char c : s)
{
if (c != '_')
bFinished = true;
if (bFinished)
t += c;
}
return t;
}
마찬가지이지만 find_if_not() 함수를 이용할 수도 있다.
string ltrim(string s)
{
auto it = find_if_not(s.begin(), s.end(), [](char c) { return c == '_'; });
return (it == s.end()) ? "" : string(it, s.end());
}
처음으로 공백이 아닌 지점을 뒤에서부터 찾아 우측 공백을 없앤다.
string rtrim(string s)
{
string t = "";
bool bFinished = false;
for (auto rit = s.rbegin(); rit != s.rend(); ++rit)
{
if (*rit != '_')
bFinished = true;
if (bFinished)
t = *rit + t;
}
return t;
}
find_if_not() 함수를 뒤에서부터 수행하고 문자열을 뒤집어도 된다.
string rtrim(string s)
{
auto rit = find_if_not(s.rbegin(), s.rend(), [](char c) { return c == '_'; });
s = (rit == s.rend()) ? "" : string(rit, s.rend());
reverse(s.begin(), s.end());
return s;
}
좌우측 공백을 없앤다.
string trim(string s)
{
return ltrim(rtrim(s));
}
istream은 공백을 자동으로 무시한다.
string remove_blank(string s)
{
string t;
istringstream iss(s);
ostringstream oss;
while (iss >> t)
oss << t;
return oss.str();
}
ostringstream을 활용해 좌측을 특정 문자만큼 채울 수 있다.
string fill(int num, int width, char ch)
{
ostringstream oss;
oss << setw(width) << setfill(ch) << num;
return oss.str();
}
예시
void main()
{
string s = "___H_E_L_L_O___";
cout << ltrim(s) << endl;
cout << rtrim(s) << endl;
cout << trim(s) << endl;
s = " H E LL O W OR L D ";
cout << remove_blank(s) << endl;
cout << fill(603, 6, '0') << endl;
cout << fill(111, 7, '#') << endl;
}
출력
H_E_L_L_O___
H_E_L_L_O___
___H_E_L_L_O
___H_E_L_L_O
H_E_L_L_O
HELLOWORLD
000603
####111
'자료구조 & 알고리즘 > 기타' 카테고리의 다른 글
unique()를 활용한 연속된 값의 제거 (0) | 2023.03.04 |
---|---|
문자열에서 문자를 검색하는 strchr() (0) | 2023.03.04 |
istream의 기능들 (0) | 2023.03.02 |
정답률보다 오답률이 높을 때 (0) | 2023.02.26 |
정규 표현식으로 문자열 교체 (0) | 2023.02.21 |