你能指定什么不是 std::getline 中的分隔符吗?



我希望它将任何不是字母字符的字符都视为分隔符。我该怎么做?

你不能。默认分隔符为n:

while (std::getline (std::cin, str) // 'n' is implicit

对于其他分隔符,请传递它们:

while (std::getline (std::cin, str, ' ') // splits at a single whitespace

但是,分隔符的类型是char,因此您只能使用一个"拆分字符",但不能使用不匹配的字符。

如果您的输入恰好在std::string这样的容器中,则可以使用find_first_not_offind_last_not_of


在你的另一个问题中,你确定你已经考虑了所有的答案吗?其中一个使用istream::operator>>(std::istream&, <string>),它将匹配一系列非空白字符。

您没有。getline是一个用于简单工作的简单工具。如果你需要更复杂的东西,那么你需要使用更复杂的工具,比如RegEx之类的。

使用std::getline()不能随心所欲,但可以自己滚动。这里有一个getline变体,让你指定一个谓词(函数、函子、lambda,如果它是C++11)来指示一个字符是否是分隔符,同时还有几个重载,让你传入一个分隔符字符串(有点像strtok()):

#include <functional>
#include <iostream>
#include <string>
using namespace std;
template <typename Predicate>
istream& getline_until( istream& is, string& str, Predicate pred)
{
    bool changed = false;
    istream::sentry k(is,true);
    if (bool(k)) {
        streambuf& rdbuf(*is.rdbuf());
        str.erase();
        istream::traits_type::int_type ch = rdbuf.sgetc(); // get next char, but don't move stream position
        for (;;ch = rdbuf.sgetc()) {
            if (istream::traits_type::eof() == ch) {
                is.setstate(ios_base::eofbit);
                break;
            }
            changed = true;
            rdbuf.sbumpc(); // move stream position to consume char
            if (pred(istream::traits_type::to_char_type(ch))) {
                break;
            }
            str.append(1,istream::traits_type::to_char_type(ch));
            if (str.size() == str.max_size()) {
                is.setstate(ios_base::failbit);
                break;
            }
        }
        if (!changed) {
            is.setstate(ios_base::failbit);
        }
    }            
    return is;
}
// a couple of overloads (along with a predicate) that allow you
// to pass in a string that contains a set of delimiter characters
struct in_delim_set : unary_function<char,bool>
{
    in_delim_set( char const* delim_set) : delims(delim_set) {};
    in_delim_set( string const& delim_set) : delims(delim_set) {};
    bool operator()(char ch) {
        return (delims.find(ch) != string::npos);
    };
private:
    string delims;
};
istream& getline_until( istream& is, string& str, char const* delim_set)
{
    return getline_until( is, str, in_delim_set(delim_set));
}
istream& getline_until( istream& is, string& str, string const& delim_set)
{
    return getline_until( is, str, in_delim_set(delim_set));
}
// a simple example predicate functor
struct is_digit : unary_function<char,bool>
{
    public:
        bool operator()(char c) const {
            return ('0' <= c) && (c <= '9');
        }
};

int main(int argc, char* argv[]) {
    string test;
    // treat anything that's not a digit as end-of-line
    while (getline_until( cin, test, not1(is_digit()))) {
        cout << test << endl;
    }
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新