2012-01-23 5 views
2

특정 구분 기호로 구분 된 3 개의 값을 병렬로 구문 분석합니다.연속 된 구분 기호가있는 strtok_s 동작

token1 = strtok_s(str1, separator, &nextToken1); 
token2 = strtok_s(str2, separator, &nextToken2); 
token3 = strtok_s(str3, separator, &nextToken3); 

while ((token1 != NULL) && (token2 != NULL) && (token3 != NULL)) 
{ 
    //... 
    token1 = strtok_s(NULL, separator, &nextToken1); 
    token2 = strtok_s(NULL, separator, &nextToken2); 
    token3 = strtok_s(NULL, separator, &nextToken3); 
} 

'-'가 구분 기호라고 가정합니다.

1-2-3-45 

효과적으로 이러한 부분의 각을 초래할 것 : 동작없이 연속으로 구분 된 문자열이 있다는 것입니다 그러나

1 
2 
3 
45 

, 두 개의 연속 구분 된 문자열 :

1-2--3-45 

길이가 0 인 문자열을 반환하지 않으므로 그 결과는 건너 뜁니다.

1 
2 
3 
45 

하지

1 
2 

3 
45 

어떤 해결 방법이나 전략 0 길이 포함한 모든 실제 부품을 얻기 위해 더 적합 할 것인가? 가능한 경우 strtok_s를 다시 구현하지 마십시오.

+0

strtok()은 입력 문자열을 수정하기 때문에 악의적입니다. 그 외에도, 나는 이것에 대한 대답에 대해 궁금합니다. –

+0

필자의 경우, strtok은 원하는 모든 문자열을 수정할 수있다. 나는 원본을 유지하고 복사본을 만들고있다. – MPelletier

+0

필자는 Microsoft의 strtok_s.inl에 들어가서 첫 번째 "구분 기호가없는"문자에 선행 구분 기호가 건너 뛰기 때문에 실제로 이것이 예상 된 동작임을 알았습니다. 흠 ... – MPelletier

답변

6

불행히도 strtok()은 빈 토큰을 무시합니다. 비록 당신이 그렇게하지 않기를 바란다고하더라도, 다른 방법은 없지만, 예를 들어 strchr()을 사용하여 다음 구분자를 찾은 다음 토큰을 임시 변수에 복사하여 처리합니다. 이렇게하면 빈 토큰을 처리 할 수 ​​있습니다.

1

예, 이것이이 기능의 작동 방식입니다. 여러 개의 공백 문자가 빈 단어로 취급되어서는 안되는 단어 구문 분석과 같은 작업에 더 적합합니다.

많은 구문 분석을 수행했습니다. 여기서 코드를 한 번에 하나씩 검사하는 내 파서를 작성합니다. 그렇게 어렵지는 않으며 원하는 방식으로 정확히 작동하게 만들 수 있습니다. 예를 들어 필자는 기사에서 CSV 파일을 구문 분석하기 위해 C++ 코드를 게시했습니다. Reading and Writing CSV Files in MFC