Skipping expected characters like scanf() with cin

前端 未结 5 836
南笙
南笙 2020-12-03 19:12

How to achieve scanf(\"%d # %d\",&a,&b);sort of effect with cin in C++ ?

5条回答
  •  佛祖请我去吃肉
    2020-12-03 19:48

    Here's another way. You can classify # as a whitespace character through the std::ctype facet imbued in the locale:

    #include 
    #include 
    #include 
    
    namespace detail
    {
        enum options { add, remove };
    
        class ctype : public std::ctype
        {
        private:
            static mask* get_table(const std::string& ws, options opt)
            {
                static std::vector table(classic_table(),
                                               classic_table() + table_size);
                for (char c : ws)
                {
                    if (opt == add)
                        table[c] |= space;
                    else if (opt == remove)
                        table[c] &= ~space;
                }
                return &table[0];
            }
        public:
            ctype(const std::string& ws, options opt)
                : std::ctype(get_table(ws, opt)) { }
        };
    }
    
    class adjustws_impl
    {
    public:
        adjustws_impl(const std::string& ws, detail::options opt) :
            m_ws(ws),
            m_opt(opt)
        { }
    
        friend std::istream& operator>>(std::istream& is,
                                        const adjustws_impl& manip)
        {
            is.imbue(std::locale(is.getloc(),
                                 new detail::ctype(manip.m_ws, manip.m_opt)));
            return is;
        }
    private:
        std::string m_ws;
        detail::options m_opt;
    };
    
    adjustws_impl setws(const std::string& ws)
    {
        return adjustws_impl(ws, detail::add);
    }
    
    adjustws_impl unsetws(const std::string& ws)
    {
        return adjustws_impl(ws, detail::remove);
    }
    
    int main()
    {
        std::istringstream iss("10 # 20");
        int a, b;
    
        iss >> setws("#");
        iss >> a >> b;
    
        iss >> unsetws("#");
        std::cout << a << ' ' << b; // 10 20
    } 
    

提交回复
热议问题