用尺度c++完成string與各類類型之間的轉換。本站提示廣大學習愛好者:(用尺度c++完成string與各類類型之間的轉換)文章只能為提供參考,不一定能成為您想要的結果。以下是用尺度c++完成string與各類類型之間的轉換正文
要完成這個目的,非stringstream類莫屬。
這個類在頭文件中界說, < sstream>庫界說了三品種:istringstream、ostringstream和stringstream,分離用來停止流的輸出、輸入和輸出輸入操作。別的,每一個類都有一個對應的寬字符集版本。
簡略起見,我重要以stringstream為中間,由於每一個轉換都要觸及到輸出和輸入操作。
示例1示范如何應用一個stringstream對象停止從 string到int類型的轉換 留意,應用string對象來取代字符數組。如許可以免緩沖區溢出的風險。並且,傳入參數和目的對象的類型被主動推導出來,即便應用了不准確的格局化符也沒有風險。
示例1:
std::stringstream stream;
string result="10000";
int n = 0;
stream << result; stream >> n;//n等於10000
int到string類型的轉換
string result;
int n = 12345;
stream << n;
result =stream.str();// result等於"12345"
反復應用stringstream對象 假如你盤算在屢次轉換中應用統一個stringstream對象,記住再每次轉換前要應用clear()辦法,在屢次轉換中反復應用統一個 stringstream(而不是每次都創立一個新的對象)對象最年夜的利益在於效力。stringstream對象的結構和析構函數平日長短常消耗CPU 時光的。經實驗,單單應用clear()其實不能消除stringstream對象的內容,僅僅是了該對象的狀況,要反復應用統一個 stringstream對象,須要應用str()從新初始化該對象。
示例2:
std::stringstream strsql;
for (int i= 1; i < 10; ++i)
{
strsql << "insert into test_tab values(";
strsql << i << ","<< (i+10) << ");";
std::string str = strsql.str();// 獲得string
res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
std::cout << strsql.str() << std::endl; strsql.clear();
strsql.str("");
}
轉換中應用模板 也能夠輕松地界說函數模板來將一個隨意率性的類型轉換到特定的目的類型。
例如,須要將各類數字值,如int、long、double等等轉換成字符串,要應用以一個string類型和一個隨意率性值t為參數的to_string()函數。
to_string()函數將t轉換為字符串並寫入result中。
應用str()成員函數來獲得流外部緩沖的一份拷貝:
示例3:
template void to_string(string & result,const T& t)
{ ostringstream oss;//創立一個流 oss< out_type convert(const in_value & t)
{ stringstream stream; stream<>result;//向result中寫入值 return result; }
如許應用convert(): double d; string salary; string s=”12.56”; d=convert(s);//d等於12.56 salary=convert(9000.0);//salary等於”9000”
結論:在曩昔留上去的法式代碼和純潔的C法式中,傳統的情勢的轉換隨同了我們很長的一段時光。然則,如文中所述,基於 stringstream的轉換具有類型平安和不會溢出如許搶眼的特征,使我們有充分得來由擯棄而應用< sstream>。
固然如今還有一個更好的選擇,那就是應用boost庫中的lexical_cast,它是類型平安的轉換。
以下例:
#include #include #include #include #include
using namespace std;
using namespace boost;
int main(void)
try
{
//以下是內置類型向string轉換的處理計劃
//lexical_cast優勢顯著
int ival;
char cval;
ostringstream out_string;
string str0;
string str1;
ival = 100;
cval = 'w';
out_string << ival << " " << cval;
str0 = out_string.str();
str1 = lexical_cast(ival) + lexical_cast(cval);
cout << str0 << endl; cout << str1 << endl;
//以下是string向內置類型轉換的處理計劃
//簡直和stringstrem比擬,lexical_cast就是類型平安的,
int itmpe;
char ctmpe;
str0 = "100k";
str1 = "100h";
istringstream in_string( str0 );
in_string >> itmpe >> ctmpe;
cout << itmpe << " " << ctmpe << endl;
itmpe = lexical_cast(str1);
ctmpe = lexical_cast(str1);
system( "PAUSE" );
return 0;
} catch(bad_lexical_cast e)
{ cout << e.what() << endl; cin.get(); }