2014-02-09 27 views
1

我正在尋找解決方案來追加字符串與其他原語,並發現stringstream是最簡單的解決方案。不過,我想簡化流程,所以我想製作一個功能來緩解它的使用。如果你提出了連接的替代方法,我需要最終的結果是char *。我用了一個循環(i)與:如何使用stringstream作爲C++函數的參數?

std::stringstream ss; 
ss << "test" << i;  
char* name = new char[ss.str().size() + 1];//allocate 
strcpy(name, ss.str().c_str());//copy and put (char*)c_str in name 

所以輸出的東西鏈接test1test2test3 ...這是最合理的解決方案,我能鼓起。我試圖把它變成一個易於使用的功能,但遇到了問題。我想這樣做:

char* string_to_pointer(char* dest, std::stringstream* _ss) { 
    char* result = new char[_ss->str().size() + 1]; 
    strcpy(result, _ss->str().c_str()); 
    return result; 
} 

然後我可以這樣做:

std::stringstream ss; 
ss << "test" << i;  
char* name = string_to_pointer(name, &ss); 

我很新的C++,這似乎是正確使用語法,但我遇到了運行時問題,並會歡迎解決方案,以便如何在不導致Boost的情況下輕鬆使用該功能。

+0

你試過了嗎? 編輯:你的運行時問題是什麼? – lightandlight

+0

爲什麼你需要做「string_to_pointer」轉換?你確定你想要最終的結果是'char *'嗎?如果它是最終的,那麼就不需要修改它了,所以也許const char *?這樣你可以繼續使用stringstream直到最後。 – mockinterface

+0

string_to_pointer很奇怪:它不使用它的第一個參數。 – laune

回答

0

使用std::stringstream::str()函數來獲取字符串的內容。

例子:

int foo = 42; 
double bar = 12.67; 

std::stringstream ss; 
ss << "foo bar - " << foo << ' ' << bar; 

std::string result = ss.str(); 

如果你不想修改字符串進一步,現在你可以簡單的調用result.c_str()獲取const char*。但是,如果你真的需要一個modifyable char*您必須將字符串的內容複製到一個CString:

std::unique_ptr<char[]> cstring = new char[result.size() + 1]; 
strcpy(cstring.get(), result.c_str()); 
+0

我遇到的解決方案與您的第二個代碼塊非常相似。我無法將該塊冷凝成易於使用的功能。例如:'char * myFunc(char * dest,stringstream ss)'或'char * myFunc(char * dest,string s)'。具體來說:'錯誤錯誤C3867:'std :: basic_string ,std :: allocator > :: c_str':函數調用缺少參數列表;使用'&std :: basic_string ,std :: allocator > :: c_str'創建一個指向成員的指針 ' – feyd

0
char* string_to_cstring (const std::string &_ss) 

會更乾淨!使用string_to_cstring(ss.str())

需要返回的C字符串是否可更改?因爲如果沒有,只要在需要的地方使用ss.str().c_str()

或使用:

char* result = new char[ss.str().size() + 1](); // value initialized 
ss.str().copy(result,std::string::npos); 
0

什麼是這樣的:

#include <string> 
#include <sstream> 

class ToString { 
    std::ostringstream stream; 
public: 
    template<typename T> 
    inline ToString &operator<<(const T&val) { 
    stream << val; 
    return *this; 
    } 

    inline operator std::string() const { 
    return stream.str(); 
    } 
}; 

您可以使用它像這樣:

std::string str = ToString() << "Test " << 5 << " and " << 4.2; 
相關問題