std::string內容概要
阿新 • • 發佈:2019-01-06
string的建構函式
- 預設建構函式:
string(); //構造一個空的字串string s1
- 拷貝建構函式:
string(const string &str); //構造一個與str一樣的string。如string s1(s2)。
// 帶引數的建構函式
string(const char *s); //用字串s初始化
string(int n,char c); //用n個字元c初始化
string的存取字元操作
const char &operator[] (int n) const ;
const char &at(int n) const;
char &operator[] (int n);
char &at(int n);
char c = strA[3];
char d = strA.at(5);
strA[3] = 'X';
strA.at(5) = 'Y';
- operator[]和at()均返回當前字串中第n個字元,但二者是有區別的
-
主要區別在於
at()
在越界時會丟擲異常,[]
在剛好越界時會返回(char)0
,再繼續越界時,編譯器直接出錯。
如果你的程式希望可以通過try...catch
at()
。
從string取得const char*
const char *c_str() const; // 返回一個以'\0'結尾的字串
把string拷貝到char*指向的記憶體空間
int copy(char *s, int n, int pos=0) const;
把當前串中以pos
開始的n
個字元拷貝到以s
為起始位置的字元陣列中,返回實際拷貝的數目。
注意要保證s
所指向的空間足夠大以容納當前字串,不然會越界。
string的長度
int length() const; //返回當前字串的長度。長度不包括字串結尾的'\0'。
bool empty() const; //當前字串是否為空
string的賦值
string &operator=(const string &s);//把字串s賦給當前的字串
string &assign(const char *s); //把字串s賦給當前的字串
string &assign(const char *s, int n); //把字串s的前n個字元賦給當前的字串
string &assign(const string &s); //把字串s賦給當前字串
string &assign(int n,char c); //用n個字元c賦給當前字串
string &assign(const string &s,int start, int n); //把字串s中從start開始的n個字元賦給當前字串
string的連線
string &operator+=(const string &s); //把字串s連線到當前字串結尾
string &operator+=(const char *s);//把字串s連線到當前字串結尾
string &append(const char *s); //把字串s連線到當前字串結尾
string &append(const char *s,int n); //把字串s的前n個字元連線到當前字串結尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos, int n);//把字串s中從pos開始的n個字元連線到當前字串結尾
string &append(int n, char c); //在當前字串結尾新增n個字元c
string的比較
int compare(const string &s) const; //與字串s比較
int compare(const char *s) const; //與字串s比較
compare
函式在>
時返回 1
,<
時返回 -1
,==
時返回 0
。比較區分大小寫,比較時參考ASCII
順序,排越前面的越小。大寫的A比小寫的a小。
string的子串
string substr(int pos=0, int n=npos) const; //返回由pos開始的n個字元組成的子字串
string的查詢
int find(char c,int pos=0) const; //從pos開始查詢字元c在當前字串的位置
int find(const char *s, int pos=0) const; //從pos開始查詢字串s在當前字串的位置
int find(const string &s, int pos=0) const; //從pos開始查詢字串s在當前字串中的位置
find()
如果查詢不到,就返回-1
int rfind(char c, int pos=npos) const; //從pos開始從後向前查詢字元c在當前字串中的位置
int rfind(const char *s, int pos=npos) const;
int rfind(const string &s, int pos=npos) const;
//rfind是反向查詢的意思,如果查詢不到, 返回-1
string的插入
string &insert(int pos, const char *s);
string &insert(int pos, const string &s);
// 前兩個函式在pos位置插入字串s
string &insert(int pos, int n, char c); // 在pos位置 插入n個字元c
string的刪除
string &erase(int pos=0, int n=npos); //刪除pos開始的n個字元,返回修改後的字串
string的替換
string &replace(int pos, int n, const char *s);//刪除從pos開始的n個字元,然後在pos處插入串s
string &replace(int pos, int n, const string &s); //刪除從pos開始的n個字元,然後在pos處插入串s
void swap(string &s2); //交換當前字串與s2的值
string與wstring的區別
string
是對char*
的管理,一個字元只佔一個位元組大小。一個漢字佔兩個位元組,ASCII編碼。wstring
是對wchar_t*
的管理,一個字元佔兩個位元組大小,一個漢字佔兩個位元組,Unicode
編碼。wstring
的使用方法跟string
類似,區別主要在於函式引數char*
與函式引數wchar_t*
string與wstring的轉換
-
第一種方法
呼叫Windows的API函式:WideCharToMultiByte()
函式和MultiByteToWideChar()
函式 -
第二種方法
使用ATL的CA2W
類與CW2A
類。
或使用A2W
巨集與W2A
巨集 -
第三種方法,跨平臺的方法
-
使用
CRT
庫的mbstowcs()
函式和wcstombs()
函式,需設定locale
。
以下是第三種方法的實現例子:
#include <string>
#include <locale.h>
using namespace std;
//wstring轉成string
string ws2s(const wstring &ws)
{
string curLocale = setlocale(LC_ALL,NULL); //curLocale="C";
setlocale(LC_ALL,"chs");
const wchar_t * _Source=ws.c_str();
size_t _Dsize=2*ws.size()+1;
char * _Dest = new char[_Dsize];
memset(_Dest,0,_Dsize);
wcstombs(_Dest,_Source,_Dsize);
string result = _Dest;
delete[] _Dest;
setlocale(LC_ALL,curLocale.c_str());
return result;
}
//string轉成wstring
wstring s2ws(const string &s)
{
string curLocale = setlocale(LC_ALL,NULL); //curLocale = "C"
setlocale(LC_ALL, "chs");
const char *_Source = s.c_str();
size_t _Dsize = s.size()+1;
wchar_t *_Dest = new wchar_t[_Dsize];
wmemset(_Dest,0,_Dsize);
mbstowcs(_Dest,_Source,_Dsize);
wstring result = _Dest;
delete[] _Dest;
setlocale(LC_ALL, curLocale.c_str());
return result;
}
編碼統一化,編寫單一原始碼
如果我們想建立兩個版本的程式,一個處理ASCII
字串,另一個處理Unicode
字串,
最好的解決辦法是編寫出既能按ASCII
編譯又能按Unicode
編譯的單一原始碼。把以下程式碼加入到程式中,只要修改一個巨集就能滿足我們的要求。
#ifdef _UNICODE
typedef wstring tstring;
typedef wchar_t tchar;
#define _T(x) L ## x
#else
typedef string tstring;
typedef char tchar;
#define _T(x) x
#endif