2012-04-17 2 views
0

내 코드에 대해 "문자열을 역 참조 할 수 없음"오류가 발생합니다.이 오류는 인터넷 어딘가에서 그대로 복사됩니다. 응용 프로그램은 완벽하게 릴리스 모드 (VS 2010)에서 컴파일되지만 계속 디버그 모드에서 오류가 발생합니다. *에 문자열을 분할하고 각 단어를 벡터에 저장해야합니다. 누구든지 아이디어가 있습니까? 정말 비교 (string :: npos! = found) 부분을 좋아하지 않는 것 같습니다.C++ 토큰 화 해제 할 수없는 문자열

string newString = "Something*NotCool"; 

size_t found = newString.find_first_of("+*-/%()"); 
size_t lastPos = 0; 
//while (found != newString.length) 
while (string::npos != found || string::npos != lastPos) 
{ 
    if (found >= newString.length()) break; 
    if (found == lastPos) 
    { 
     lastPos = found+1; 
     found = newString.find_first_of("+*-/()", found+1); 
    } 
    string temp (newString,lastPos,found); 
    temp.assign(newString, lastPos, found-lastPos); 
    strings.push_back(temp); 
    lastPos = found+1; 
    found = newString.find_first_of("+*-/()", found + 1); 
} 

귀하의 도움에 감사드립니다 !!!

+0

그것은 나 2010 VS를 사용하기위한 컴파일 (I는 CL이 아닌 IDE를 사용). 더 많은 코드를 보여줘야합니다. –

+0

이것이 오류를 throw하는 코드입니까? 나는 이것이 오류 메시지를 피하기 위해 추가 된 코드를 가지고 있다고 의심하지만 대신에 마지막 단어가'strings'에 추가되지 않는 문제를 여전히 가지고 있습니다. 또한 컴파일러 오류와 런타임 오류의 구분에주의하십시오. 오류 메시지가 없어도 올바르게 실행된다는 말과 달리 '완벽하게 컴파일 된'오류 메시지는 매우 다릅니다. –

+0

'if (found == lastPos) '로직이 꺼져 있다고 생각합니다. 이것은 행에 두 개의 *가 있는지 감지하고 무시하는 것입니다. 그러나 연속으로 3 개 이상 *이 잡히지는 않습니다. – Lalaland

답변

1

코드가 VS2010에서 오류를 생성하지 않았습니다. 정규 표현식 (<regex> 라이브러리)에 대한 액세스 권한을 가지고 있기 때문에

, 또 다른 대안이 될 수있다 :

std::string str = "Something*NotCool"; 
std::regex re("[^(\\*\\+%/\\-\\(\\))]+"); 
std::sregex_token_iterator begin(str.begin(), str.end(), re), end; 
std::vector<std::string> tokens; 
std::copy(begin, end, std::back_inserter(tokens)); 
+0

이것은 EPIC입니다. 도와 줘서 고마워. 방금 분할 기호를 처리 할 수 ​​있도록 \\ /를 re (...)에 추가했습니다. (내가 그랬 으면 좋겠어요 - 일종의 임시 테스트). 나는이 "새로운"특징에 관해서 약간의 독서를 가지고있는 것처럼 보입니다. 다시 한 번 감사드립니다! –

+0

나는 정규식 이스케이프 (escalape)를 벗어나야 어떻게하는 것이 좋을지 모르겠다. 그것은 자신의 작은 "Waldo는 어디 있니?" 구분 기호 문자 집합입니다. 그리고''% ''가 항상 거기에 있지 않아야한다는 것을 잊지 마십시오. (또는 어쩌면 원래 코드의 다른 버그였습니다 ...) –

+2

@MichaelBurr : 아마도 C++ 11에서 원시 문자열 리터럴을 도입 한 이유 일 것입니다. –