2

を使用して、日時文字列のような値を解析する必要が2012-12-21 12:10:35ありtime_tますboost::spirit。ここに私のコードスニペットがあります:

tc_     =   lexeme[int_[phx::ref(tm_.tm_year)=(_1-1900)]>>'-'
                     >>int_[phx::ref(tm_.tm_mon)=(_1-1)]>>'-'
                    >>int_[phx::ref(tm_.tm_mday)=_1]>>+space
                    >>int_[phx::ref(tm_.tm_hour)=_1]>>':'
                     >>int_[phx::ref(tm_.tm_min)=_1]>>':'
                    >>int_[phx::ref(tm_.tm_sec)=_1]]    [_val = (long)mktime(&tm_)];

ここで、 はタイプtc_qiルールです: qi::rule<Iterator, long(), Skipper>、タイプtm_のメンバー変数ですstruct tm

コードはコンパイルされますが、機能しません。mktime()まったく呼ばれなかったようです。私は何を間違っていますか?

4

1 に答える 1

0

正規表現を使用してC ++ 11で実行できます。コンパイラが十分に新しい場合、これは移植可能で標準的です。

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main()
{
    std::regex txt_regex("([0-9]{4})[-]([0-9]{2})[-]([0-9]{2})[ ]([0-9]{2})([:])([0-9]{2})([:])([0-9]{2})");//  
    string strTmp;
    strTmp="2010-12-15 15:25:46";
    std::smatch match;
    std::regex_search( strTmp, match, txt_regex );

    if(regex_match(strTmp,txt_regex))
         cout<<"Ok"<<endl;
    else
    {
    cout<<"Invalid input"<<endl;
    return 0;
    }
    if ( match.empty() )
    {
         std::cout << "...no more matches" << std::endl;
         return 0;
    }
    for ( auto x : match )
    {
        std::cout << "found: " << x << std::endl;
    }
    string str = match.suffix().str();
    cout <<str <<std::endl;
    return 0; 
}

これにより、表示する文字列のさまざまな部分を表示してから、構造を埋めることができます。

いつものようにコメントをお待ちしております(何かが明確でないか不完全な場合)。

于 2013-06-16T23:01:12.530 に答える