Is there a TryParse equivalent in C++ (gcc)?

前端 未结 4 2093
滥情空心
滥情空心 2021-01-15 15:48

Is there a equivalent of TryParse in C++(gcc) ?

I would like to parse a string which may contain (+31321) and store it as long. I know phone numbers are stored as st

4条回答
  •  情书的邮戳
    2021-01-15 16:08

    The trouble with strtoul() and family there is no real way to test for failure.
    If it fails to parse then it returns 0 without setting errno (which is only set on overflow).

    boost lexical cast

    #include 
    
    
    int main()
    {
        try
        {
            long x = boost::lexical_cast("+1234");
            std::cout << "X is " << x << "\n";
        }
        catch(...)
        {
            std::cout << "Failed\n";
        }
    }
    

    Doing it using streams

    int main()
    {
        try
        {
            std::stringstream stream("+1234");
            long x;
            char test;
    
            if ((!(stream >> x)) || (stream >> test))
            {
                // You should test that the stream into x worked.
                // You should also test that there is nothing left in the stream
                //    Above: if (stream >> test) is good then there was content left after the long
                //           This is an indication that the value you were parsing is not a number.
                throw std::runtime_error("Failed");
            }
            std::cout << "X is " << x << "\n";
        }
        catch(...)
        {
            std::cout << "Failed\n";
        }
    }
    

    Using scanf:

    int main()
    {
        try
        {
            char integer[] = "+1234";
            long x;
            int  len;
    
            if (sscanf(integer, "%ld%n", &x, &len) != 1 || (len != strlen(integer)))
            {
                // Check the scanf worked.
                // Also check the scanf() read everything from the string.
                // If there was anything left it indicates a failure.
                throw std::runtime_error("Failed");
            }
            std::cout << "X is " << x << "\n";
        }
        catch(...)
        {
            std::cout << "Failed\n";
        }
    }
    

提交回复
热议问题