如何修改传递给 cout 的字符串
How can I modify strings that are passed to cout?
假设我想 rot13 传递给 cout(或其他 ostream)的每个字符串,这样,比如说cout<<"Foo Bar Baz.;"
(甚至cout<<rot13<<"Foo Bar Baz.";
)输出Sbb One Onm.
我该怎么做呢?
(我的第一个想法是用一个 streambuf 派生的类替换 cout 的 streambuf,该类可以完成所有工作。但是看到原始的 streambuf 负责将内容定向到控制台......这根本行不通。
您可以编写自己的流,重载运算符<<用于char*,std::string等,并打印转换后的文本。
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
class ostream_rot13 : public basic_ostream <char, char_traits<char> >
{
public:
ostream_rot13(std::basic_streambuf<char, char_traits<char> >* sb)
: basic_ostream<char, char_traits<char> >(sb) {}
ostream_rot13& operator<<(const char* text)
{
std::string s(text);
int rot=13;
std::transform(std::begin(s), std::end(s), ostream_iterator<char>(*this), [rot] (char c) {
if(c >= 'a' && c <= 'z')
return 'a' + (c + rot - 'a') % 26;
else if(c >= 'A' && c <= 'Z')
return 'A' + (c + rot - 'A') % 26;
return (int)c;
});
return *this;
}
};
下一步是声明此类型的全局变量,然后声明一个用新变量替换 cout 的宏。
ostream_rot13 cout_rot13(std::cout.rdbuf());
#define cout cout_rot13
然后所有 cout 实例都将变得cout_rot13。
int main()
{
cout << "Foo Bar Baz";
return 0;
}
您不能将 cout 的 streambuf 包装
在自己的 streambuf 中,将所有调用转发到包装的缓冲区吗?
在将"put"调用转发到包装的 streambuf 之前,您只需要进行一些编码。
一个小腐烂13来说,工作量很大。
相关文章:
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么我的 cout 在输出中没有显示字符串?
- 使用 cout 运算符重载字符串
- C++ - 如何从上到下制作 4x4 矩阵和 cout 列(需要解密字符串)
- C++ 不能在cout中使用向量和字符串文字
- 使用字符串流加速 std::cout 日志记录
- C++ cout 不接受字符串或带 + 的字符串
- cout 切断 for 循环中的字符串开头
- 使用带有 std::cout 的单引号打印字符串实际上打印了数字
- 为什么cout输出内存地址不是字符串?
- 为什么我的 C++ 代码不能显示 cout 字符串
- 在COUT字符串期间,在控制台上闪烁光标
- C++ cout 字符串不起作用.请指教
- cout 字符串和向量在同一行中
- 如何更改对象的 cout 字符串
- 在 std::cout 字符串上崩溃
- cout 字符串和 c_str 在 C++ 中给出不同的值
- 在c++中使用字符串(搜索字符串,分割字符串,cout<<字符串)
- Flex cout字符串崩溃
- 三元运算符中的 Cout 字符串和 int