C/C++字符串處理

目錄

 

1 snprintf函數

2 轉換函數比較

3 string中函數的用法


1 snprintf函數

1、寫入目標串的字符數不超過size,包括'\0'

2、必須格式化參數,防止源串包含%s等格式化字符,會在後面尋找字符串指針,若未找到,會出現非法內存訪問

3、必須判斷返回值,避免寫溢出(目標串str是字符數組,如果不以'\0'結束,對函數返回值ret(即預寫入字符個數)進行src[ret]寫入,會出現寫越界,索引ret位不存在)

4、使用sizeof設置size(sizeof會計算'\0',sizeof(str) = strlen(str) +1)

5、無論被複制的源串是否截斷,都會在目標串末尾添加終止符'\0',而返回值是預寫入的字符數,並不包含終止符

6、字符串寫成字符,編譯只會警告,運行就會coredump。因爲'ww'的函數沒被準確定義。如snprintf(buf,sizeof(buf),"%s",'ww')

 

2 轉換函數比較

itoa函數:沒對char*進行越界檢查,可能造成數組溢出

snprintf函數: 會對數組進行越界檢查,效率高。使用snprintf函數時,一定要記得格式化參數%s,不然在處理特殊字符串時會出core;對返回值進行判斷,否則會導致越界

stringstream類: 採用內存自動管理機制,最安全,具有模板親和力,可用於泛型編程。但使用臨時對象,有性能開銷,效率較低。大於0轉換成功,等於0轉換失敗,對應s頭文件:#include<sstream>

 

3 string中函數的用法

c_str():生成一個const char*指針,指向以空字符終止的數組,這個數組的數據是臨時的,當有一個改變這些數據的成員函數被調用後,其中的數據就會失效。  //c = s.c_str();  推薦:strcpy(c,s.c_str())

data():c_str類似,但返回的數組不以空字符終止

copy(p,n):從string類型對象中至多複製n個字符到字符指針p指向的空間中,要保證p中有足夠的空間存儲n個字符

assign(const string& str, size_t pos, size_t n):將str的內容從位置pos起的n個字符作爲原字串的新內容賦給原字串

assign(const string& str):將str替換原字串的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章