1. 程式人生 > >std::string內容概要

std::string內容概要

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