c++字符及字符串操作总结

0. 字符基础

字符集(character set) :ASCII 、Unicode,不同的字符集对应的字符类型也不一样。

ASCII:是一种单字节字符集(single-byte character set),它所有的字符都只用一个字节(Byte)表示。‘\0’为字符串结束符

Unicode: 所有字符均用两个字节来表示,0 是它的结束标志。(vs2005 默认为Unicode的字符集)

不同的字符集的字符串声明类型如表1所示。

表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编程注意事项


(1):字符串前要加上_T或者_TEXT.比如:_T(“dadad”);
(2):将char换成TCHAR (unsigned char必须去掉unsigned)

TCHAR的定义如下:

#ifdef UNICODE

typedef wchar_t TCHAR;

#else

typedet char TCHAR;

#endif

(3):将str函数换成_tcs函数
(4):printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型.
(5):对于字符串和整型的转换,尽量使用_itot和_ttoi来进行相互转化,不要使用atoi或itoa。

Cstring 和string的区别
相同点: 
(1) 都可以取代 char* 的使用
(2)均为C++的类库,封装了丰富的字符串操作接口
(3)都使用了模板技术


不同点:

(1) Cstring是微软visual c++提供的MFC的一个类,只支持MFC的工程;string在c++标准库中,封装在std命名空间中,具有更好的移植性。

(2)string类既是一个标准的c++标准类库,又是STL类库,所以支持Iterator操作。

(3)和char*之间的转换方式不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值