C/C++ 字符串 总结(一)

2014-11-24 12:01:29 · 作者: · 浏览: 0

1 字符基础

1.1 单字节字符集(single-byte character set(SBCS))

顾名思义,在这种模式下,所有的字符都只用一个字节表示,常见的如,ASCII

1.2 多字节字符集(multi-byte character set(MBCS))

在Windows中MBCS包含两种字符类型,单字节字符和双字节字符.由于windows使用的多字节字符绝大部分是两个字节长,所以MBCS常被DBCS代替。

1.3 unicode

Unicode是一种所有的字符都使用两个字节编码的编码模式。Unicode字符有时也被称作宽字符,因为它比单子节字符宽(使用了更多的存储空间)。

常见的为utf-8,还有一个比较少用的是utf-16

1.3.1 utf-8 BOM头

浏览器中或某些文本编辑器中会给utf-8 文本 加上bom头。在程序读取的过程中需要去掉BOM头否则会出现乱码。

BOM 格式为: EF BB BF,10进制格式为:-17 -69 -65

Utf8去BOM头的方法:

string Utf8DeBOM(string s) {
	int c1 = s[0];
	int c2 = s[1];
	int c3 = s[2];

	if (c1 == -17 && c2 == -69 && c3 == -65)
	{
		s = s.substr(3, s.length());	
	}

	return s;
}

2 C/C++/VC++中的字符串

2.1 C中的字符串

C语言中, 没有字符串的数据类型,使用一个以NULL('\0')字符结尾的字符数组来保存字符串。

char* p = "Hello world";

char* p = (char*)malloc (100 * sizeof(char));

char p[100] = "hello world";

2.2 C++ 中的字符串

C++ 语言中有单独字符串类型,在string头文件中,还有对应的宽字符串wstring.

string iStr = "Hello world";

wstring wStr = "Hello world";

2.3 VC ++ 中的字符串

在学Window是开发过程中最头疼的莫过于一堆字符串宏。

类型 MBCS 中含义 Unicode 中含义

TCHAR char wchar_t

WCHAR wchar _twchar_t

LPSTR char* char*

LPCWSTR const wchar_t* const wchar_t*

LPCSTR const char* const char*

LPWSTR wchar_t* wchar_t*

LPTSTR TCHAR* TCHAR*

LPCTSTR const TCHAR* const TCHAR*

char 标准c的字符类型(1Byte)
wchar_t 保存UNICODE字符集的类型(2Byte)

TCHAR的定义如下:

#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

再了解一个宏_T(),使用宏_T(),使代码有了unicode的意识。

#ifdef UNICODE
#define _T(x) L##x
#else
#define _T(x) x

3 标准C++ 字符串操作

3.1 构造方法

string(const char *s); //用c字符串s初始化

string(int n,char c); //用n个字符c初始化

此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常

3.2 操作方法

3.2.1 字符操作

const char &operator[](int n)const; // 索引操作,取单个字符

const char &at(int n)const;// 同上

char &operator[](int n);//同上

char &at(int n);//同上

operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。


const char *data()const;//返回一个非null终止的c字符数组

const char *c_str()const;//返回一个以null终止的c字符串

int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目

3.2.2 string的特性描述

int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)

int max_size()const; //返回string对象中可存放的最大字符串的长度

int size()const; //返回当前字符串的大小

int length()const; //返回当前字符串的长度

bool empty()const; //当前字符串是否为空

void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分


3.2.3 string类的输入输出操作

string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。

函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符'\n'分开。

3.2.4 string的赋值

string &operator=(const string &s);//把字符串s赋给当前字符串

string &assign(const char *s);//用c类型字符串s赋值

string &assign(const char *s,int n);//用c字符串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 &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串

3.2.5 string的连接

string &operator+=(const string &s);//把字符串s连接到当前字符串的结尾

string &append(const char *s); //把c类型字符串s连接到当前字符串结尾

string &append(const char *s,int n);//把c类型字符串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 &append(