인프런 커뮤니티 질문&답변

박근철님의 프로필 이미지
박근철

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

split 부분에서 input.find(delimiter)의 값에 대한 궁금증 입니다!

작성

·

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. 컴파일러마다 한글을 해석하는 바이트수가 다를 수 있다. (유추)

 

감사합니다. 

강사 큰돌 올림.

박근철님의 프로필 이미지
박근철
질문자

이렇게 정성스럽게 답변 달아주셔서 정말 감사합니다 완벽히 이해가 되었습니다 ㅎㅎ 앞으로도 잘 부탁드립니다! 좋은 하루 되세요!!!

박근철님의 프로필 이미지
박근철

작성한 질문수

질문하기