アルファベット文字以外のものを区切り文字とみなしたいと思っています。これどうやってするの?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
を使用できます。
他の質問では、すべての回答を検討してもよろしいですか? 1つはistream::operator>>(std::istream&, <string>)
を使用します。これは一連の空白以外の文字と一致します。
3
あなたはしません。 getline
は簡単な仕事のための簡単なツールです。より複雑なものが必要な場合は、RegExなどのより複雑なツールを使用する必要があります。
0
あなたはstd::getline()
を使用してあなたが望むことはできませんが、自分でロールすることはできます。ここでは、文字がデリミタであるかどうかを示す述語(関数、ファンクタ、ラムダ、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. C++の関数getlineで2つ以上のデリミタを使用できますか?
- 2. getlineは '\ n' - 2つのデリミタを持つgetlineを無視します
- 3. スカラとは何ですか?getline()、std :: cin.eof()、std :: cin.bad()?ここ
- 4. プログラムはstd :: getlineをスキップします
- 5. getline関数用の複数のデリミタ
- 6. std :: getline()はバッファを完全に空にしますか?
- 7. を選択し、STD :: CINとstd :: getlineのはよく一緒に遊んでいない
- 8. ウェイクアップのstd :: getlineの信号
- 9. std :: getlineはstd :: back_insert_iteratorを受け入れません
- 10. #include <string>と<fstream>の文でもVisual Studioでgetline()またはstoi()を認識できない
- 11. std :: getline()はboolとどのように等しくなりますか?
- 12. std :: unordered_mapをなぜstd :: partitionできないのですか?
- 13. std :: getlineは空白を削除しますか?
- 14. coutを使用するときにstd :: getline()がメモリアドレスを返す
- 15. はistringstream(C++)からではないのgetline()は
- 16. split()でもデリミタを保持
- 17. Segfault from std :: getline with delimiter
- 18. std :: getline(input、d.info)not working
- 19. インタフェースはメソッド名のみを指定できますが、戻り値の型は指定できませんか?
- 20. いつもstd :: forwardを使うのはなぜですか?
- 21. UISliderにデリミタを追加することはできますか?
- 22. seekgがgetlineで動作しないのはなぜですか?
- 23. なぜ私はstd :: :: std :: sets間でstd :: unique_ptrsを移動できませんか?
- 24. ルートビューで余白を指定できないのはなぜですか?
- 25. C++ std :: getline結果文字列で別の文字列を連結することはできません
- 26. jqGrid行をオプションとして指定しても編集できないのはなぜですか?
- 27. なぜGCC -O3はstd :: dequeよりもフィルタイテレータで無限のstd :: distanceを引き起こしますか?
- 28. std :: getline関数を正しく使用するには
- 29. std :: reverse_iterator :: operator []の戻り値の型が指定されていないのはなぜですか?
- 30. なぜstd :: getlineはファイル名を含むchar配列を上書きしますか?