2011-08-01 58 views
0

我正在使用C++。我有以下字符串:如何在沒有提升的情況下標記字符串?

2011-07-01T14:32:39.1846579 + 02:00

有人能告訴我怎樣可以提取在另一個字符串2011-07-01 14點32分?

+0

可能的重複[我如何tokeniz在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++解決方案也更容易閱讀。我強烈建議你看看「>>」 - 運算符, - 類和 - 類。 – AudioDroid

+0

Downvoted,主要是因爲它被接受。這是一個可能的解決方案,但不是「C++方式」。 C++ 11正則表達式或'std :: istringstream'絕對是更好的解決方案。 – Lstor

0

你可以使用strsep()strtok_r()來分割你想要的分隔符(在你的情況'T'和':')。

4

你可以看看std :: istringstream及其>>操作符(不像sscanf那樣明確)。

2

如果您有C++ 11,最簡單的解決方案是使用常規 表達式。也可以使用std::istringstream, ,特別是如果你有一些額外的操縱器用於例如匹配一個 單個字符。 (如果你不這樣做,你應該問題 往往不夠發生。)對於一些這種簡單的,但是,這兩個 解決方案可能被認爲是矯枉過正:std::find'T',然後 ' '會給你一個迭代每兩個字符,並std::string的 雙迭代器構造,會給你的 字符串,如:

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); 

(你可能會想,我已經提供了更好的錯誤處理)

相關問題