C++ 如何使用input&;将所有空白字符替换为另一个字符;输出流操纵器?

C++ 如何使用input&;将所有空白字符替换为另一个字符;输出流操纵器?,c++,c++11,c++14,manipulators,C++,C++11,C++14,Manipulators,例如,我使用std::cin从用户处获得输入: “这是一个示例程序” 我想用另一个字符替换每个空格,并将其显示为: “这是一个\is\sample\program” 注意:其他字符可以是任何字符。例如:*或&或$等 我想使用流操纵器来实现这一点。可能吗 下面是一些我尝试使用std::getline的示例代码,但这不是我所期望的那种代码。我想使用任何现有的I/o流操纵器或我自己的操纵器来执行此操作 #include <iostream> #include <sstream>

例如,我使用
std::cin
从用户处获得输入:

“这是一个示例程序”

我想用另一个字符替换每个空格,并将其显示为:

“这是一个\is\sample\program”

注意:其他字符可以是任何字符。例如:
*
&
$

我想使用流操纵器来实现这一点。可能吗

下面是一些我尝试使用std::getline的示例代码,但这不是我所期望的那种代码。我想使用任何现有的
I/o流操纵器
或我自己的操纵器来执行此操作

#include <iostream>
#include <sstream>
#include <string>

using namespace std;
string spaceToStar(string text){
    for (int i=0;i<sizeof(text);i++){
        if(text[i] == ' ')
            text[i] = '*';
    }
    return text;
}

int main () {
    string text, s;
    cout << "enter your line: " << endl;
    getline(cin, text);

    s = spaceToStar(text);

    cout << s << endl;


  return 0;
}
#包括
#包括
#包括
使用名称空间std;
字符串spaceToStar(字符串文本){

对于(int i=0;i您可以在字符通过流缓冲区时替换字符,并为简化的语法创建一个操纵器

#包括
#包括
使用名称空间std;
名称空间xalloc{
int from(){static int x=std::ios_base::xalloc();return x;}
int to(){static int x=std::ios_base::xalloc();return x;}
}
模板
struct filterbuf:std::basic_streambuf{
std::基本流量BUF*sbuf;
std::ios_base&ios;
公众:
filterbuf(std::basic_ostream&str):sbuf(str.rdbuf()),ios(str){}
int溢出(类型名filterbuf::int_类型c){
if(filterbuf::traits_type::eq_int_type(c,ios.iword(xalloc::from())){
返回this->sbuf->sputc(ios.iword(xalloc::to());
}
返回此->sbuf->sputc(c);
}
int sync(){返回this->sbuf->pubsync();}
};
模板
结构重新解释{
cT从,到;
templatereinterpret(tf,tt):从(f),到(T){
};

std::basic_ostream&operator您可以在字符通过流缓冲区时替换字符,并为简化的语法创建一个操纵器

#包括
#包括
使用名称空间std;
名称空间xalloc{
int from(){static int x=std::ios_base::xalloc();return x;}
int to(){static int x=std::ios_base::xalloc();return x;}
}
模板
struct filterbuf:std::basic_streambuf{
std::基本流量BUF*sbuf;
std::ios_base&ios;
公众:
filterbuf(std::basic_ostream&str):sbuf(str.rdbuf()),ios(str){}
int溢出(类型名filterbuf::int_类型c){
if(filterbuf::traits_type::eq_int_type(c,ios.iword(xalloc::from())){
返回this->sbuf->sputc(ios.iword(xalloc::to());
}
返回此->sbuf->sputc(c);
}
int sync(){返回this->sbuf->pubsync();}
};
模板
结构重新解释{
cT从,到;
templatereinterpret(tf,tt):从(f),到(T){
};

std::basic_ostream&operator您是否要求我们做家庭作业?您是否尝试过这样做?发生了什么?您编写的代码是什么样子的?出了什么问题?您是否考虑过字符串中出现的特殊字符?您可能想/需要转义这些字符。您想创建一个新的操纵器还是想创建一个新的操纵器使用现有的操纵器来实现这一点?是什么让您认为流操纵器是解决这一问题的方法?为什么不简单地使用
std::replace_if()
?使用
std::iswspace()
std::isspace()
作为predicate@Omnifarious不,这是以前试卷中给出的问题类型。我可以做“stringstream”和“if”,但我的答案不会得到任何分数。我想我可以在StackOverflow中找到答案。你是在要求我们做家庭作业吗?你试过这么做吗?发生了什么事?你做了什么您编写的代码是什么样子的?出了什么问题?您考虑过字符串中出现的特殊字符吗?您可能想/需要转义这些字符。您想创建一个新的操纵器还是想使用现有操纵器来实现这一点?您为什么认为流操纵器是解决此问题的方法?为什么不简单地说使用
std::replace_if()
替代?使用
std::iswspace()
std::isspace()
作为predicate@Omnifarious不,这是以前试卷中给出的问题类型。我可以做这个“stringstream”和“if”,但我的答案不会得到任何分数。我想我可以在StackOverflow中找到答案。谢谢你分享代码……但是,你能解释一下代码的过程吗?@HarshaVardhan E每个stream对象都使用一个内部流缓冲区类来存储和处理传入的字符。我定义了一个新的streambuf类
filterbuf
,它将某个字符作为另一个字符进行处理并传递。其余的都是样板文件,允许我们使用语法
感谢您共享代码…但是,您能解释一下吗我知道代码的处理过程吗?@HarshaVardhan每个流对象都使用一个内部流缓冲区类来存储和处理传入的字符。我定义了一个新的streambuf类
filterbuf
,它将某个字符作为另一个字符进行处理并传递。其余的是样板文件,允许我们使用语法
cout