C++,boost:这是解析字符串的最快方法,如tcp:// adr:port/into地址字符串和一个int for port?

Rel*_*lla 1 c++ string boost tcp

我们的std :: string Atcp://adr:port/如何将它解析为地址的std :: string和端口一个诠释?

Jer*_*fin 9

虽然有些人不会认为它特别是kosher C++,但最简单的方法可能是使用sscanf:

sscanf(A.c_str(), "tcp://%[^:]:%d", &addr, &port);
Run Code Online (Sandbox Code Playgroud)

另一种可能性是将字符串放入字符串流中,使用将大多数字母和标点符号视为空格的构面填充流,并只读取地址和端口,如:

std::istringstream buffer(A);
buffer.imbue(new numeric_only);
buffer >> addr >> port;
Run Code Online (Sandbox Code Playgroud)

方面看起来像这样:

struct digits_only: std::ctype<char> 
{
    digits_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        // everything is white-space:
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);

        // except digits, which are digits
        std::fill(&rc['0'], &rc['9'], std::ctype_base::digit);

        // and '.', which we'll call punctuation:
        rc['.'] = std::ctype_base::punct;
        return &rc[0];
    }
};
Run Code Online (Sandbox Code Playgroud)

operator>>将空格视为"字段"之间的分隔符,因此这将192.168.1.1:25视为两个字符串:"192.168.1.1"和"25".

  • 扫描的+1.还提到Facets很不错,但在我看来,它们看起来只是看起来丑陋且难以理解 (3认同)
  • tsk tsk tsk ... OP想要字符串和int ...;) (2认同)