2017-10-04 8 views
2

좋아, C++의 숙제 프로젝트에서 작업 중이므로 문제가 발생하여이를 해결할 수없는 것 같습니다. 이 함수는 사용자 정의 분리 문자로 입력 문자열을 분할하고 나중에 액세스 할 벡터에 하위 문자열을 저장합니다. 나는 기본 파서를 알아 냈다고 생각하지만, 입력의 마지막 부분을 분할하고 싶지는 않습니다.C++ 문자열 구문 분석기 문제

int main() { 
    string input = "comma-delim-delim&delim-delim"; 
    vector<string> result; 
    vector<char> delims; 
    delims.push_back('-'); 
    delims.push_back('&'); 
    int begin = 0; 

    for (int i = begin; i < input.length(); i++){ 
     for(int j = 0; j < delims.size(); j++){ 
      if(input.at(i) == delims.at(j)){ 
      //Compares chars in delim vector to current char in string, and 
      //creates a substring from the beginning to the current position 
      //minus 1, to account for the current char being a delimiter. 
       string subString = input.substr(begin, (i - begin)); 
       result.push_back(subString); 
       begin = i + 1; 
      } 

위의 코드는 마지막 대시까지 입력 코드를 분할 할 때 잘 작동합니다. 이후에는 다른 구분 기호로 실행되지 않으므로 하위 문자열로 저장되지 않고 결과 벡터로 푸시됩니다.

else if(input.at(i) == input.at(input.length())){ 
    string subString = input.substr(begin, (input.length() - begin)); 
    result.push_back(subString); 
} 

그러나, 위 부분과 경계 부족 오류가 점점 계속 : 문제를 해결하기위한 시도 그래서, 나는 다음과 함께 넣어. 하위 문자열을 분할 할 때 경계에 문제가있는 것으로 보이며이를 해결하는 방법을 알 수 없습니다. 어떤 도움이 필요합니까?

+0

마지막 분할이 발생한 지점을 저장하는 것이 좋습니다. 루프 끝에서 해당 값이 문자열의 끝이 아닌 경우 마지막 분할 t 이후의 모든 것을 밀어 넣으십시오. o 귀하의 결과. 당신이 지금 무엇을 가지고 있는지는 다소 의심 스럽습니다. 왜냐하면 그것은 바운드 문제와는 별도로 마지막 짝짓기와 동일한 숯을 고려하기 때문입니다. –

+1

승무원 추가를 시도해 보셨습니까? 문자열에 구분 기호를 추가하십시오. –

+0

두 개의 구분 기호'-'와'&'를 사용하고 싶습니까? – Raindrop7

답변

1

코드에서 .size()는 0에서 시작하므로 마지막 인덱스보다 1이 많음을 기억해야합니다. 따라서 크기 1의 배열은 [0]에서 인덱싱됩니다. 그래서 당신이 input.at (input.length()) 할 경우 항상 1 장소에서 오버플로됩니다. input.at (input.length() - 1)는 마지막 요소입니다. 여기 나를 위해 일하는 예가 있습니다. 루프가 끝나면 문자열의 마지막 부분을 잡아 당깁니다. 우리는 입력의 end()를 확인할 수 있도록 코드에서 근무

if(begin != input.length()){ 
    string subString = input.substr(begin,(input.length()-begin)); 
    result.push_back(subString); 
} 
+0

매력처럼 작동합니다! 도와 주셔서 감사합니다. –

0

질문에 나는 반복자를 교체했습니다

int main() { 
    string input = "comma-delim-delim&delim-delim"; 
    vector<string> result; 
    vector<char> delims; 
    delims.push_back('-'); 
    delims.push_back('&'); 
    auto begin = input.begin(); // use iterator 

    for(auto ii = input.begin(); ii <= input.end(); ii++){ 
     for(auto j : delims) { 
      if(ii == input.end() || *ii == j){ 
       string subString(begin,ii); // can construct string from iterators, of if ii is at end 
       result.push_back(subString); 
       if(ii != input.end()) 
        begin = ii + 1; 
       else 
        goto done; 
      } 
     } 
    } 
done: 
    return 0; 
} 
+1

간단한 '중단'대신 [goto] (https://xkcd.com/292/)를 사용하기로 결정한 이유는 무엇입니까? – scohe001

+0

@ scohe001 'break'는 내부 'for'루프에서 벗어나고 외부 루프는 실제로'end()'로 들어가므로'ii ++'는 허용되지 않습니다. – wally

+0

아, 내 잘못, 나는 고토를보고 터널 비전을 얻었다. 플래그가 [더 나은 C++ 연습]이 아니겠습니까 (https://stackoverflow.com/questions/46586/goto-still-considered-harmful)? – scohe001

0

이 프로그램은 여러 구분 기호 구문 분석 std::find_first_of을 사용