У меня есть эта строка в памяти, которую я хочу напечатать на терминал или файл журнала — без получения мусора / непечатаемых символов, которые, ну, в общем, ограничивают мой стиль. Итак, вместо
my_output_stream << my_string;
я хочу делать
my_output_stream << sanitize(my_string);
или, может быть
sanitize_to(my_output_stream, my_string);
Есть ли какое-то идиоматическое / стандартное средство для этого?
Идиоматическим способом было бы фильтровать непечатные.
Я не знаю ни одного существующего способа, но легко написать один: увидеть его Жить на Колиру
#include <cctype>
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
template <typename It>
std::string sanitize(It f, It l) {
std::ostringstream oss;
for (;f!=l;++f)
{
if((std::isgraph(*f) || std::isspace(*f)) && *f != '\r' && *f != '\n')
oss << *f;
else
oss << "%" << std::hex << std::setw(2) << std::setfill('0') <<
static_cast<unsigned>(static_cast<unsigned char>(*f));
}
return oss.str();
}
template <typename C>
std::string sanitize(C const& c) {
using std::begin;
using std::end;
return sanitize(begin(c), end(c));
}
int main()
{
std::cout << sanitize("Hello\tworld\r\n. §1.3 \b") << "\n";
}
Библиотека cctype имеет функцию isprint (), которая возвращает true, если символ печатается. Вы можете использовать это, чтобы проверить, является ли символ в строке печатным или нет, и, ну, пусть он напечатает символ, если он печатается, и ничего не делать, если это не так.