gpt4 book ai didi

c++ - 如何修改传递给 cout 的字符串?

转载 作者:太空狗 更新时间:2023-10-29 21:02:51 26 4
gpt4 key购买 nike

假设我想对传递给 cout(或另一个 ostream)的每个字符串进行 rot13,这样,比如说 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;
}

关于c++ - 如何修改传递给 cout 的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com