باستخدام Bost Tokenizer Escaped_List_Separator مع معلمات مختلفة

StackOverflow https://stackoverflow.com/questions/541561

  •  23-08-2019
  •  | 
  •  

سؤال

مرحبا كنت أحاول الحصول على مزامنة للعمل باستخدام فئة Tokenizer Boost Library. لقد وجدت هذا البرنامج التعليمي في وثائق دفعة:

http://www.boost.org/doc/libs/1 _36 _0 / Libs / tokenizer / هارب _ shapparator.htm

المشكلة هي أنني غير قادر على الحصول على الحجة لهرسة _SPEARTER (""، "،")؛

ولكن إذا قمت بتعديل دفعة / Tokenizer.hpp ملف يعمل. ولكن هذا ليس الحل المثالي كان يتساءل عما إذا كان هناك أي شيء أفتقده للحصول على حجج مختلفة في القائمة الفارقة _Sparator.

أريد أن أجعله ينقسم على مسافات مع "و" للهرب ومع عدم وجود حرف هروب داخل السلسلة المعروضة.

يستخدم هذا لنظام تحليل الوسيطة في نظام وحدة التحكم في IBAME.


include <iostream>
include <boost/tokenizer.hpp>
include <string>

INT الرئيسي () {باستخدام مساحة الاسم STD؛ باستخدام مساحة الاسم؛ سلسلة S = "EXEC SCRIPT1 " نص البرنامج النصي رقم واحد "؛ فاصل السلسلة 1 ("")؛ // لا تترك الوسيطات المعروضة الهروب أنفسهم سلسلة فاصل 2. u003Cescaped_list_separatoru003Cchar> (فاصل 1، فاصل 2، فاصل 3)> TOK (ق)؛ ل (المميز u003Cescaped_list_separatoru003Cchar> (فاصل 1، فاصل 2، فاصل 3)> :: AIRERATOR التسول = Tok.begin ()؛ التسول! = tok.end ()؛ ++ التسول) {cout << * التسول << " n"؛ }}

الخطأ من Visual Studio 2005 هو الخطأ C2974: "BOOST :: TOKENIZER ': وسيطة قالب غير صالحة ل" TokenizerFunc "، اكتب المتوقع

تحرير: تم تهدئة هذا السؤال من قبل Ferrucio وشرحه بيتر شكرا للجميع.

هل كانت مفيدة؟

المحلول

جرب هذا:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()
{
    using namespace std;
    using namespace boost;
    string s = "exec script1 \"script argument number one\"";
    string separator1("");//dont let quoted arguments escape themselves
    string separator2(" ");//split on spaces
    string separator3("\"\'");//let it have quoted arguments

    escaped_list_separator<char> els(separator1,separator2,separator3);
    tokenizer<escaped_list_separator<char>> tok(s, els);

    for(tokenizer<escaped_list_separator<char>>::iterator beg=tok.begin(); beg!=tok.end();++beg)
    {
        cout << *beg << "\n";
    }
}

نصائح أخرى

يبدو أنك تعلن عن نوع Tokenizer الخاص بك بشكل غير صحيح.

typedef boost::tokenizer< boost::escaped_list_separator<char> > Tokenizer;
boost::escaped_list_separator<char> Separator( '\\', ' ', '\"' );
Tokenizer tok( s, Separator );

for( Tokenizer::iterator iter = tok.begin(); iter != tok.end(); ++iter )
{ cout << *iter << "\n"; }

تريد أن تجعل boost::tokenizer< boost::escaped_list_separator< char > > كائن مكتوب مع boost::escaped_list_separator< char > كائن فاصل مثل tokenizerfunc.

نقطة ذات صلة بعد ليست الإجابة عن هذا هو أنه إذا أراد المستخدم إخراج اقتباس مزدوج في النتيجة، فإن الاقتباس المضمن ("") الموصوف في ويكيبيديا (مثلما هو الحال هنا) يجب استبدال سلسلة من (\\\"), ، أين \\ يعني هروب كار و \" يعني علامة اقتباس. بهذه الطريقة، سيتم عرض علامة اقتباس في نتيجة الإخراج. مقتطف التعليمات البرمجية التالي مثال.

typedef boost::escaped_list_separator<char> std_token;
typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;

std_token a_token( "\\", ",", "\"" );
std::string s = "\"Boost,\\\" C++ Libraries\" ";
tokenizer tok{ s, a_token };
for ( const auto &t : tok )
    std::cout << t << '\n';

هذا إخراج نموذجي لهذا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top