2011-08-01 2 views
0

저는 C++로 일하고 있습니다.부스트없이 문자열을 토큰 화하는 방법은 무엇입니까?

2011-07-01T14 : 32 : 나는 다음과 같은 문자열을 가지고 39.1846579 + 02 : 00

사람이 어떻게 다른 문자열에서 2011-07-01 14시 32분를 추출 할 수 말해 줄래?

+0

: 두 개의 문자 및 std::string의 이중 반복자 생성자, 각 당신에게 문자열, 예를 줄 것이다 가능한 중복 [어떻게해야합니까?] C++의 문자열?] (http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) – iammilind

+0

당신은 어떻게 그 특별한 문자열을 다루는 지 묻습니다. 토큰 화는 일반적으로 작동합니까? – nicks

답변

2

는 그 sscanf를 당신이 찾고있는 무엇을 생각 :

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

당신은 다음 데이터를 다시 포맷 snprintf를 사용할 수 있습니다.

+2

'sscanf (...)'는 "단순한"C의 일부입니다. 일반적으로 STL/C++ 솔루션을 선택하는 것이 더 안전한 방법입니다. 예를 들어 런타임이 아닌 컴파일 타임에 오류가 발생한다는 것을 의미 할 수 있습니다. 또한 STL/C++ 솔루션은 읽기 쉽습니다. ">>"- 연산자, -class 및 -class를 살펴보실 것을 강력히 권장합니다. – AudioDroid

+0

Downvoted, 주로 승인을 받았기 때문입니다. 그것은 가능한 해결책이지만 "C++ 방식"은 아닙니다. C++ 11 정규식 또는'std :: istringstream'은 분명 더 나은 솔루션입니다. – Lstor

0

strsep() 또는 strtok_r()을 사용하여 구분 기호 ('T'및 ':')에 원하는대로이 문자열을 분할 할 수 있습니다.

4

std :: istringstream 및 >> 연산자 (sscanf와 같이 명확하지 않음)를 살펴볼 수 있습니다.

2

C++ 11을 사용하는 경우 가장 간단한 해결책은 일반 표현을 사용하는 것입니다. 특히, 을 사용할 수도 있습니다. 예를 들어 몇 가지 추가 조작기가있는 경우 특히 그렇습니다. 단일 문자가 과 일치합니다. (문제가있는 경우 이 자주 발생합니다.) 그러나이 간단한 내용은 해결책이 과도한 것으로 간주 될 수 있습니다. std::find'T', 그 다음은 ' '은 다음과 같은 반복기를 제공합니다.

std::string::const_iterator posT = std::find(s.begin(), s.end(), 'T'); 
std::string::const_iterator posSpace = std::find(posT, s.end(), ' '); 
std::string date(s.begin(), posT); 
std::string time(posT != posSpace ? posT + 1 : posT , posSpace); 

(. 당신은 아마 내가 제공 한 더 나은 오류 처리를 할 것입니다)

관련 문제