我希望它考虑任何不是字母字符的分隔符。我怎样才能做到这一点?你能指定什么不是std :: getline中的分隔符吗?
3
A
回答
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>)
,它将匹配一系列非空白字符。
3
你不知道。 getline
是简单工作的简单工具。如果你需要更复杂的东西,那么你需要使用更复杂的工具,比如RegEx或其他东西。
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;
}
相关问题
- 1. 的std ::函数getline:分隔字符与字符数
- 2. 在std :: getline()上使用任何字符作为分隔符
- 3. 问题与getline()分隔符
- 4. 特林转换为在std :: getline分隔符中使用的str字符串
- 5. getline与分隔符存储空字符
- 6. 功能上用分隔符分隔字符串的最佳方法是什么?
- 7. 使用stringstream的getline分隔符
- 8. 你能指定read.table中的列数吗?
- 9. std :: getline不接受std :: back_insert_iterator
- 10. SQL:什么是所有的分隔符?
- 11. 什么是'多部分标识符',为什么不能绑定?
- 12. C++逗号分隔/ getline
- 13. strtok只在指定的分隔符上不能标记
- 14. php为什么当你声明它时,你不能指定某个属性?
- 15. 你能指导我在代码中出了什么问题吗?
- 16. 使用什么独特的分隔符而不是逗号来分隔
- 17. 什么是JavaScript中的小数点分隔符符号?
- 18. Python 3中的@操作符/分隔符是什么?
- 19. 为什么我不能std ::分区这个std :: unordered_map?
- 20. getline中的缓冲点是什么?
- 21. std :: getline()返回
- 22. 我可以在StringTemplate中使用字符串分隔符吗?如果不是,什么是好的模板引擎?
- 23. 什么是std :: safe_string?
- 24. 为什么总是在std :: for_each中指定迭代器?
- 25. std ::向带自定义分隔符的字符串向量
- 26. hs_err_pid文件中指定堆的不同部分是什么?
- 27. 为什么我不能在awk中使用字符串“?B?”作为分隔符
- 28. 你可以在ASP.net Textboxes中制作一个“分隔符”吗? (C#)
- 29. 我们可以为hive视图明确指定分隔符吗?
- 30. 如何指定小数点分隔符