我希望它将任何不是字母字符的内容视为分隔符。我怎么能这样做?
答案 0 :(得分:3)
你没有。 getline
是一个简单工作的简单工具。如果您需要更复杂的东西,那么您需要使用更复杂的工具,如RegEx或其他东西。
答案 1 :(得分:3)
你做不到。默认分隔符为\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_of
或find_last_not_of
。
在你的另一个问题中,你确定你已经考虑了所有答案吗?一个使用istream::operator>>(std::istream&, <string>)
,它将匹配一系列非空白字符。
答案 2 :(得分:0)
你无法使用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;
}