작성
·
302
0
큰돌님 안녕하세요! C++ 교안을 공부하다가 split 부분에서 궁금한 것이 생겨서 질문 드립니다!
while((pos=input.find(delimiter)) != string::npos){
cout << input.find(delimiter) << "\n";
token = input.substr(0, pos);
ret.push_back(token);
input.erase(0, pos+delimiter.length());
}
이 함수에서 find 반환값이 궁금해 cout로 출력을 시켜봤습니다.
예상대로는 "안녕하세요 큰돌이는 바보에요 정말이에요!" 문자열의 스페이스 index인 5, 4, 4가 나와야할 것 같았는데
두배인 10, 8, 8이 출력이 되었고 다른 컴파일러를 사용했을 때는 세배인 15, 12, 12 출력 되었습니다.
혹시 이렇게 배수로 출력되는 이유가 따로 있는지 궁금합니다!
답변 1
1
안녕하세요. 박근철님. ㅎㅎ
find는 찾은값의 위치인 이터레이터를 반환하기 떄문에 그렇습니다.
또한 input이 erase되면서 하기 때문에 그렇죠.
예를 좀 쉽게 들기 위해 한글 보다는 영어로 예시를 들어보죠.
#include <bits/stdc++.h>
using namespace std;
int main(){
string input = "abcd efg aaaaaaa bbbbb";
string delimiter = " ";
vector<string> ret;
long long pos;
string token;
while((pos=input.find(delimiter)) != string::npos){
cout << input.find(delimiter) << "\n";
token = input.substr(0, pos); // 4 3 7
ret.push_back(token);
input.erase(0, pos+delimiter.length());
}
ret.push_back(input);
for(string a : ret) cout << a << '\n';
return 0;
}
이런 코드가 되겠죠? 자 여기서 4, 3, 7이 반환되게 됩니다. abcd라는 4글자를 찾고 난 다음의 위치 4
그다음 efg ... 라는 글자를 기준으로 3, aaaaaaa 라는 글자를 기준으로 7이 반환되게 됩니다.
아마 컴파일러마다 다른 것은.. 한글을 처리하는 바이트수가 상이할 수 있어서 그런 것같네요.
이해가 되시죠?
1. input값은 해당 로직이 지남에 따라 "삭제"가 된다.
2. 해당 삭제되어가는 input을 기반으로 해당 delimeter를 찾고 그 위치를 반환한다. 그렇기 때문에 삭제된 것이 반영된 문자열을 기반으로 탐색하므로 저렇게 나타나게 된다.
3. 컴파일러마다 한글을 해석하는 바이트수가 다를 수 있다. (유추)
감사합니다.
강사 큰돌 올림.
이렇게 정성스럽게 답변 달아주셔서 정말 감사합니다 완벽히 이해가 되었습니다 ㅎㅎ 앞으로도 잘 부탁드립니다! 좋은 하루 되세요!!!