2013-10-18 2 views
0
vector<string> CategoryWithoutHashTags; 
string tester = "#hello junk #world something #cool"; 
char *pch; 
char *str; 
str = new char [tester.size()+1]; 
strcpy(str, tester.c_str()); 

pch = strtok(str,"#"); 
while(pch!=NULL) 
{ 
    CategoryWithoutHashTags.push_back(pch); 
    pch=strtok(NULL,"#"); 
} 
cout<<CategoryWithoutHashTags[0]<<endl; 

모든 해시 태그 단어를 문자열 벡터에 저장하는 프로그램이 필요합니다. 위의 프로그램은 "hello"가 아닌 첫 번째 색인에 "hello junk"를 저장합니다. 프로그램을 변경하려면 어떻게해야합니까?입력 문자열에서 특정 문자열을 얻기 위해 strtok 사용

+2

이 같은 문자열을 처리하려면' –

+2

을 strtok' 사용하지 마십시오 단어는'# '이 아닌 구분 기호로 공간을 사용하십시오. 그런 다음 첫 번째 문자를보고 해시 태그인지 확인합니다. – Barmar

+2

'strtok'는 멀티 쓰레드 어플리케이션에서 특별히 위험합니다. – deepmax

답변

1

strtok을 사용하도록 설정 한 경우 재 입력 버전 strtok_r을 사용해야합니다. 그런 다음 해시 표시가 아닌 공백으로 분할하도록 코드를 변경해야합니다. 이것은 당신에게 토큰을 줄 것입니다. 마지막으로, 루프에서 첫 번째 문자를 찾으려면 해시 기호, 목록에 항목이 있으면 추가, 해시 기호가 없으면 항목을 무시해야합니다.

더 나은 방법은 문자열 스트림을 사용하는 것입니다. 문자열을 입력하고 하나씩 토큰을 읽고 해시 기호가없는 문자는 버립니다. 여기

는 C++ (11)의 람다를 사용하여 아주 작은 코드로 할 수있는 방법은 다음과 같습니다

stringstream iss("#hello junk #world something #cool"); 
istream_iterator<string> eos; 
istream_iterator<string> iit(iss); 
vector<string> res; 
back_insert_iterator< vector<string> > back_ins(res); 
copy_if(iit, eos, back_ins, [](const string s) { return s[0] == '#'; }); 

Demo on ideone.