如何修改传递给 cout 的字符串

How can I modify strings that are passed to cout?

本文关键字:cout 字符串 何修改 修改      更新时间:2023-10-16

假设我想 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来说,工作量很大。