split 부분에서 input.find(delimiter)의 값에 대한 궁금증 입니다!
365
작성한 질문수 1
큰돌님 안녕하세요! 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. 컴파일러마다 한글을 해석하는 바이트수가 다를 수 있다. (유추)
감사합니다.
강사 큰돌 올림.
1-E질문입니다!
0
516
2
3-L 틀린 부분 피드백 부탁드립니다.
0
817
2
1-A문제 순열재귀함수 질문입니다.
0
381
1
1-A 일곱난쟁이문제입니다
0
454
1
문제 풀 때 방향성에 대해
0
798
1
맥에서 vs code로 실행 관련 질문입니다
0
522
1
17071번 메모리 초과
0
386
1
1-C질문입니다!
0
418
2
2-B BFS 시간초과질문
0
629
2
1-O 13번 라인
0
440
1
6-J 놀이공원 문제 질문
0
380
1
구현관련 질문
0
482
1
강의 교안
0
318
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
545
1
안녕하세요! 재귀함수에 관해서 질문드립니다
0
535
1
1-K
0
473
2
3-G번 질문있습니다.
1
473
3
3-C 실행 시간 질문드립니다.
0
493
1
4-A 문제 풀이 질문있습니다.
0
590
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
435
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
334
1
3-O go 함수 질문 드립니다.
1
446
2
4-A 출력 질문
0
303
1
1주차 1-O 질문드립니다
0
255
1





