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。即長度為n的string物件,其記憶體空間至少為n+1個字元,且最後一個字元為’\0’。
不過在進行string操作時,有一點必須牢記:C/C++
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,因為strcpy、strncpy碰到’\0’將認為拷貝結束。總之,不要使用和str***相關的函式去操作記憶體資料,除非資料只能是string(memcpy完全可拷貝任何資料)。
---------------------------------------------------