Нет стандартного способа сделать это, но это довольно легко сделать, если я вас правильно понимаю. Если вы хотите прочитать строку с до с некоторыми пунктуациями, как если бы это была новая строка, вы можете использовать версию getline
, которая принимает предикат вместо одного разделителя:
template<class F>
std::istream& getline(std::istream& stream, std::string& string, F delim) {
string.clear();
// Get characters while the stream is valid and the next character is not the terminating delimiter.
while (stream && !delim(stream.peek()))
string += stream.get();
// Discard delimiter.
stream.ignore(1);
return stream;
};
Пример использования:
#include <iostream>
#include <cctype>
int main(int argc, char** argv) {
std::string s;
getline(std::cin, s, ::ispunct);
std::cout << s << '\n';
return 0;
}
Если вы также хотите разбить на новые строки, вы можете написать функтор:
struct punct_or_newline {
bool operator()(char c) const { return ::ispunct(c) || c == '\n'; }
};
И вместо этого вызывать как getline(std::cin, my_string, punct_or_newline())
. Надеюсь, это поможет!