getting cout output to a std::string

后端 未结 4 1256
死守一世寂寞
死守一世寂寞 2021-02-05 01:38

I have the following cout statement. I use char arrays because I have to pass to vsnprintf to convert variable argument list and store in Msg

4条回答
  •  半阙折子戏
    2021-02-05 01:58

    #include 
    
    #include 
    #include 
    #include 
    
    // This way we won't have to say std::ostringstream or std::cout or std::string...
    using namespace std;
    
    /** Simulates system specific method getpid()... */
    int faux_getpid(){
        return 1234;
    }
    
    /** Simulates system specific method pthread_self()... */
    int faux_pthread_self(){
        return 1111;
    }
    
    int main(int argc, char** argv){
    
        // Create a char[] array of 100 characters...
        // this is the old-fashioned "C" way of storing a "string"
        // of characters..
        char Msg[100];
    
    
        // Try using C++-style std::string rather than char[],
        // which can be overrun, leading to 
        // a segmentation fault.
        string s_appname1; 
    
        // Create old-fashioned char[] array of 100 characters...
        char appname2[100];
    
        // Create old-fashioned char[] array of 100 characters...
        char appname3[100]; 
    
        // Old-fashioned "C" way of copying "Hello" into Msg[] char buffer...
        strcpy(Msg, "Hello");
    
        // C++ way of setting std::string s_appname equal to "Moe"...
        s_appname1 = "Moe";
    
        // Old-fashioned "C" way of copying "Larry" into appname2[] char buffer...
        strcpy(appname2, "Larry");
    
        // Old-fashioned "C" way of copying "Shemp" into appname3[] char buffer...
        strcpy(appname3, "Shemp");
    
        // Declare le_msg to be a std::ostringstream...
        // this allows you to use the C++ "put-to" operator <<
        // but it will "put-to" the string-stream rather than
        // to the terminal or to a file...
        ostringstream le_msg;
    
        // Use put-to operator << to "write" Msg, s_appname1, s_appname2, etc...
        // to the ostringstream...not to the terminal...
        le_msg << Msg << " "<< s_appname1 <<":"<< appname2 << ":" << appname3 << " " << "!" << faux_getpid() <<" " << "~" << faux_pthread_self();
    
        // Print the contents of le_msg to the terminal -- std::cout --
        // using the put-to operator << and using le_msg.str(),
        // which returns a std::string.
        cout << "ONE: le_msg = \"" << le_msg.str() << "\"..." << endl;
    
        // Change contents of appname3 char[] buffer to "Curly"...
        strcpy(appname3, "Curly");
    
        // Clear the contents of std::ostringstream le_msg
        // -- by setting it equal to "" -- so you can re-use it.
        le_msg.str(""); 
    
        // Use put-to operator << to "write" Msg, s_appname1, s_appname2, etc...
        // to the newly cleared ostringstream...not to the terminal...
        // but this time appname3 has been set equal to "Curly"...
        le_msg << Msg << " "<< s_appname1 <<":"<< appname2 << ":" << appname3 << " " << "!" << faux_getpid() <<" " << "~" << faux_pthread_self();
    
        // Print the new contents of le_msg to the terminal using the  
        // put-to operator << and using le_msg.str(),
        // which returns a std::string.
        cout << "TWO: le_msg = \"" << le_msg.str() << "\"..." << endl;
    
        // This time, rather than using put-to operator << to "write"
        // to std::ostringstream le_msg, we'll explicitly set it equal
        // to "That's all Folks!"
        le_msg.str("That's all Folks!");
    
        // Print the new contents of le_msg "That's all Folks!" to  
        // the terminal via le_msg.str()
        cout << "THREE: le_msg = \"" << le_msg.str() << "\"..." << endl;
    
        // Exit main() with system exit value of zero (0), indicating
        // success...
        return 0;
    
    }/* main() */
    

    OUTPUT:

    ONE: le_msg = "Hello Moe:Larry:Shemp !1234 ~1111"...
    TWO: le_msg = "Hello Moe:Larry:Curly !1234 ~1111"...
    THREE: le_msg = "That's all, folks!"...
    

提交回复
热议问题