42 서울에서 드디어 새로운 언어를 공부하기 시작했다. 이전까지는 C
로만 프로그래밍을 했었는데, 드디어 C++
다!
42서울에서 제공하는 과제를 해석해보니, 원하는 기능을 구현하고 싶다면 직접 만들기보다 라이브러리를 이용하라는 말이 있었다. C 과제를 할 때는 문자열과 관련된 기본 함수들을 거의 다 직접 구현해야 했어서 번거로웠는데, 참으로 반가운 일이었다.
과제를 진행하며 알게 되는 C++ 함수들을 간단하게 정리해보자.
해당 함수를 통해 문자열에서 원하는 문자를 지울 수 있다. 구문은 다음과 같다.
erase(size_t __pos, size_t __n)
첫 번째 인자에는 시작 위치가 들어가고, 두 번째 인자에는 지울 크기가 들어간다.
나는 다음과 같이 사용했다. 문자열의 앞 뒤에 있는 화이트 스페이스를 지워야하는 상황이었다.
예를 들어 cmd = "(1. 화이트 스페이스) + abc + (2. 화이트 스페이스)"
이라는 문자열이 있다고 생각하자.
...
// 0번째부터, 화이트 스페이스가 아닌 문자까지 삭제. [(1) 부터 a 전까지]
1) cmd.erase(0, cmd.find_first_not_of(" \t\v\f\r"));
// 문자열의 끝이 화이트 스페이스인지 확인 [(2)확인]
2) while (isspace(cmd[cmd.length() - 1]))
{
// 문자열에서 화이트 스페이스가 아닌 마지막 문자부터 끝까지 삭제. [(2) 부터 마지막까지]
2-1) cmd.erase(cmd.find_last_not_of(" \t\v\f\r") + 1, cmd[cmd.length() - 1]);
}
...
cmd[cmd.length() - 1]
은 cmd
문자열 전체 길이를 말하므로 길이가 10이라고 한다면, 10번째까지 삭제하는 코드를 작성했다고 볼 수 있다.
해당 함수는 시작과 끝에 반복되는 문자를 지울 때 유용하게 사용할 수 있다. 예를 들어 cmd = "000042"
라는 문자열에서 앞에 '0' 4개를 지우고 싶다면, cmd.find_first_not_of('0')
과 같은 방식으로 코드를 짤 수 있다. 이렇게 하면 cmd
는 42
로 바뀐다. 뒤에서부터 지우고는 방법도 동일하다.
erase
함수 설명에서 볼 수 있듯이 나는 화이트 스페이스를 지우는데 활용했다. 신기한 것은 여러개의 문자를 나열해도 모두 지워준다는 것이다. 내부적으로 문자를 하나씩 돌아가며 삭제하는 듯하다.
// 0번째부터, 화이트 스페이스가 아닌 문자까지 삭제. [(1) 부터 a 전까지]
cmd.erase(0, cmd.find_first_not_of(" \t\v\f\r"));
// 문자열에서 화이트 스페이스가 아닌 마지막 문자부터 끝까지 삭제. [(2) 부터 마지막까지]
cmd.erase(cmd.find_last_not_of(" \t\v\f\r") + 1, cmd[cmd.length() - 1]);
문자열의 특정 위치가 화이트 스페이스인지 확인하고 싶을 때 사용한다. 공백이라면 0이 아닌 수를 반환하고, 공백이 아니라면 0 반환한다.
isspace가 공백이라고 판단하는 것들은 아래와 같다.
위 코드에서 문자열의 마지막에 화이트가 있는지 확인하고, 있다면 find_last_not_of
함수와 erase
함수로 화이트 스페이스를 지웠다.
while (isspace(cmd[cmd.length() - 1]))
{
cmd.erase(cmd.find_last_not_of(" \t\v\f\r") + 1, cmd[cmd.length() - 1]);
}
문자열의 길이를 구할 때 사용한다. 매우 간단하게 사용할 수 있다.
cmd = "hello"
이고 cmd
의 길이를 구하고 싶다면,
cmd.length();
로 구할 수 있고, 사이즈 5
가 반환된다.