1. 程式人生 > >stl::string與二進位制資料

stl::string與二進位制資料

C99有很多和string相關的函式,如strcat,strchr,strcmp,strcpy,strlen,strncat,strncmp,strncpy等。然而使用C++程式設計時,所有和string相關的操作均可以使用string類的相關介面完成,string提供和原來C介面類似的功能和效能,同時提供更高的安全性。

String類有一個特性:a string of length n must manage a block of memory whose size is at least n + 1。即長度為nstring物件,其記憶體空間至少為n+1個字元,且最後一個字元為’\0’

不過在進行string操作時,有一點必須牢記:C/C++

語言的string是以’\0’結尾的,對不以’\0’結尾的string進行操作容易引發錯誤,甚至導致記憶體溢位等crash

C++的string類,除了用於處理常規string操作外,其本身也可用於儲存各種資料,如檔案資料。使用者採用string( const char* str, size_type length ); 來封裝特定長度的char*資料塊。String類的各種運算子將保證資料傳遞的完整性,即string物件。

示例:

#include <iostream> using namespace std; int main() { std::string str("test string"
); cout<<str<<"  "<<str.c_str()<<endl; cout<<str.size()<<endl; char* buf = new char[str.size()+1]; memset(buf, 0, sizeof(buf)); string test(buf, str.size());   // 封裝非字元資料 cout<<test<<"  "<<test.c_str()<<endl; cout<<test.size()<<endl;
memcpy(buf, str.c_str(), str.size()); test = string(buf, str.size());   // 封裝字元資料,並自動加上 ’\0’ 結束符 cout<<test<<"  "<<test.c_str()<<endl; cout<<test.size()<<endl; return 0; }

其輸出:

test string   test string

11

11

test string   test string

11

說明:這個例子說明:當使用string( const char* str, size_type length );來構造string物件時,string物件的長度由外部指定,資料則來自str,如果length大於str地址範圍,可能引發crash!

這個例子也說明了string可用於封裝資料,即使是’\0’的資料。因此,string類可以用於儲存各種資料,字串、非字串(圖片,視訊)等資料。

注意:將資料拷貝到記憶體時,不要使用strcpy, 應該使用memcpy,因為strcpystrncpy碰到’\0’將認為拷貝結束。總之,不要使用和str***相關的函式去操作記憶體資料,除非資料只能是string(memcpy完全可拷貝任何資料)。

---------------------------------------------------