這篇文章摘自http://blog.csdn.net/kunp/archive/2004/06/30/30541.aspx;
幫我解決了從 string::c_str 到 char *類型的轉換問題。(注意,string::c_str返回的
是const char* 類型。
???很多人都使用傳統的C 庫來進行數據類型之間的轉換,這將會導致很多問題,因為這樣的轉換方法存在很多危險的陷阱。比如itoa()這個函數在標準庫中是不存在的。標準的庫提供了一種更好的轉換選擇,因為這一方法更加安全,自動,直接。
???讓我們來看一個具體的范例。假設你想把一個int轉換為string。為了達到這一目的,你必須遵循如下的步驟:
1. 建立一個stringstream對象,
2.使用操作符<<插入int數據,
3.使用操作符>>抽取前面插入到的數據到一個string對象中。
以下代碼行演示了這些步驟:
//程序名:teststream.cpp //功能:將int類型數據通過stringstream對象轉成string #i nclude <iostream> #i nclude <stdlib.h> ???// system() #i nclude <string> #i nclude <sstream> using namespace std;
int main(int argc, char *argv[]) { ??? std::stringstream stream; ??? std::string result; ??? int num = 1000; ??? ??? stream << num;????????????? ????????????//將int類型數據插入stream對象中 ??? stream >> result;?????????? ????????????//取出之前插入的數據 ??? cout << "num:\t" << num << endl; ??? cout << "result:\t" << result << endl;??? //打印 "1000"??????????????? ??? ??? system("PAUSE");? ??? return 0; }
|
???請注意我們沒有使用一個簡潔的cast操作或一個模式標志來實現stringstream轉換。操作符<<和>>會自動地刪除原始數據的類型和目標數據,并自動而安全地執行需要的轉換。
庫不會只限于一些高水平的操作,比如std::string。你可以很方便地實現一個char *變量之間的轉換:
//程序名:teststream2.cpp //功能:將int類型數據通過stringstream對象轉成char[] #i nclude <iostream> #i nclude <stdlib.h> ???// system() #i nclude <string> #i nclude <sstream> using namespace std;
int main(int argc, char *argv[]) { ??? std::stringstream stream; ??? char result[12] = {'\0'}; ??? stream << 1234;???????????????????? //insert int to stream ??? stream >> result;?????????????????? //extract previously inserted value ??? cout << result << endl;???????????? // print "1234"???????????? ??? ??? system("PAUSE");? ??? return 0; }
|
???如果你想通過使用同一stringstream對象實現多種類型的轉換,請注意在每一次轉換之后都必須調用clear()成員函數,例如:
//程序名:teststream3.cpp //功能:使用同一stringstream對象實現多種類型的轉換 #i nclude <iostream> #i nclude <stdlib.h> ???// system() #i nclude <string> #i nclude <sstream> using namespace std;
int main(int argc, char *argv[]) { ??? std::stringstream stream; ??? int n, m; ??? stream<< "456"; ??????//insert string ??? stream >> n; ?????????//extract to int ??? stream.clear(); ??????//reset stream before another conversion ??? stream<< true; ???????//insert bool value ??? stream >> m; ?????????//extract to int
??? cout << "n:\t" << n << endl;??? //print 456 ??? cout << "m:\t" << m << endl;??? //print 1? ?????????? ??? ??? system("PAUSE");? ??? return 0; }
|
???事實上,stream對象可以接收多種類型輸入的特點給我們帶來一個好處,可以將int,char*等不同類型的輸入同時導入到一個stream對象,再通過該stream對象導出一個新值。
//程序名:teststream4.cpp //功能:將int類型數據和char*數據通過stringstream對象轉成char[] #i nclude <iostream> #i nclude <stdlib.h> ???// system() #i nclude <string> #i nclude <sstream> using namespace std;
int main(int argc, char *argv[]) { ??? std::stringstream stream; ??? char ip[16]; ??? stream << 218; //insert int ??? stream << "."; //insert string ??? stream << 192; //insert int ??? stream << "."; //insert string ??? stream << 160; //insert int ??? stream << "."; //insert string ??? stream << 228; //insert int ??? ??? stream >> ip;
??? cout << "ip:\t" << ip << endl;??? //print " 218.192.160.228" ??? ??? system("PAUSE");? ??? return 0;
|