0. 字符基础
字符集(character set) :ASCII 、Unicode,不同的字符集对应的字符类型也不一样。
ASCII:是一种单字节字符集(single-byte character set),它所有的字符都只用一个字节(Byte)表示。‘\0’为字符串结束符
Unicode: 所有字符均用两个字节来表示,0 是它的结束标志。(vs2005 默认为Unicode的字符集)
不同的字符集的字符串声明类型如表1所示。
通用 MFC 数据类型
|
映射到 ASCII
|
映射到 UNICODE
|
注释
|
_TCHAR
|
char
|
wchar_t
|
_TCHAR 是一个映射宏,当定义 UNICODE 时,该数据类型映射到 wchar_t,如果没有定义 UNICODE,那么它映射到 char。
|
_T 或 _TEXT
|
char 常量字符串
|
wchar_t 常量字符串
|
功能与宏相同,在 ASCII 模式下,它们被忽略,也就是说被预处理器删除掉,但是如果定义了UNICODE, 则它们会将常量字符串转换成等价的 UNICODE 。
|
LPTSTR
|
char*, LPSTR(Win32)
|
wchar_t*
|
可移植的32位字符串指针。它将字符类型映射到工程设置的类型。
|
LPCTSTR
|
const char*, LPCSTR(Win32)
|
const wchar_t*
|
可移植的32位常量字符串指针。它将字符类型常量映射到工程设置的类型。
|
一、字符数组
C++中的字符数组是C语言的延续,在C中,没有字符串这种数据类型,而是用字符数组来保存字符串,可以通过一个char*类型的指针来操纵它。注:只有以null('\0')结尾的字符数组才是C字符串。
1.1 定义及初始化
(1)数组定义
数组是有类型名(规定元素类型)、标识符和维数(指定数组中包含元素个数)组成的复合数据类型。
数组的维数要求大于等于1的常量表达式,非const的变量和运行阶段才知道值得const变量不能用于定义数组维数。
数组定义在函数体外时,而没有赋初值时,其元素均初始化为0;如果数组定义在函数体内,而没有赋初值,其元素均无初始化。
(2)字符数组初始化
a. 字符字面值初始化 char name[] = {'L','i','l'.'y'}; 该数组维数为4
b. 字符串字面值初始化 char name[] = "Lily"; 该数组维数为5.这个初始化方式包含一个空字符(null)用于结束字符串。等价于:char name[] = {'L','i','l'.'y','\0'};
1.2 字符串输入输出
(1)输入
a. 使用输入操作符 char name[20]; cin >> a; 注:这种输入方式会忽略最初的空白字符,如:空格、制表符、换行等,而且输入会在下一个空格或换行符停止;要求输入的(字符个数 + 1 )少于数组的维数
b. 使用函数getline()获取整行输入(包括空格) char name[20]; cin.getline(name,20).
(2)输出
使用输出操作符 cout << a; 注:输出的字符不包括结束符'\0' ; 输出字符串时,cout流中使用的字符数组名,而不是数组元素名。
1.3.常用操作函数 包含在头文件 cstring中
(1)字符串长度函数: int strlen(const char*) 注:该函数的返回值不包含'\0'在内
(2)字符串复制函数: char* strcpy(char* , const char*) 注:要求第一个参数必须为数组名
还可以把一个字符串的前若干个字符复制到字符数组中 char* strcpy(char*,const char* ,N)
注:字符数组间不能赋值,因为数组名代表的是数组的地址,是常量,不能被赋值
(3)字符串比较函数:int strcmp(const char* ,const char*) 字符串的比较是自左向右逐个字符比较的(比较其ASCII码)
(4)字符串连接函数: char* strcat(char*,const char*) 函数返回值为第一个字符数组的地址
二、String 包含在string类中
String 类型支持长度可变的字符串,C++标准库负责管理和存储字符相关的内存,以及各种操作。
2.1 定义及初始化
String标准库支持多个构造函数
(1)string s1; 这个为默认构造函数,s1为空串
(2)string s2(s1);
(3)string s3("Lily");
(4)string s4(n,'w'); 初始化为n个'w'
2.2 输入输出
(1)输入
a. 输入操作符 cin >> s; 注:读取时忽略开头所有的空白字符,读取字符到下个空白字符时停止
b. 用getline读取整行文本 getline(cin,s) 注:getline不会忽略开头的空白字符,但当遇到换行符时停止,但getline会丢弃换行符,所以要自行添加。
(2)输出
输出操作符 cout << s;
2.3 常用操作函数
a string对象操作
(1)s.empty(); 为空时返回true,否则为false
(2)s.size(); 返回值为string::size_type ,这是一种配套类型,其定义为unsigned型,可以足够大的存储任意长度的string对象 注:不能把size()的返回值赋给int变量
(3)s[n]; 返回位置为n的字符 下标操作数要求是一个size_type类型的值
(4)s1 + s2; 在string对象和字符串字面值混合连接操作时,要求左右操作数至少有一个是string类型
(5)s1 = s2; 赋值的过程时:首先s1的空间释放,然后给s1分配足够存放s2副本的内存空间,最后把s2字符赋值到新分配的内存空间
(6)s1 == s2
(7)!= < <= > >=
b string对象中字符处理 包含在cctype头文件中
三 本文相关
1 vs2005编程注意事项
TCHAR的定义如下:
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedet char TCHAR;
#endif
不同点:
(1) Cstring是微软visual c++提供的MFC的一个类,只支持MFC的工程;string在c++标准库中,封装在std命名空间中,具有更好的移植性。
(2)string类既是一个标准的c++标准类库,又是STL类库,所以支持Iterator操作。
(3)和char*之间的转换方式不同