一、字符及字符串相关
字符串的实际长度(10)与数组长度(12)不相等,在存放上面10个字符之外,系统对字符数组最后两元素自动填补空字符′\0′。
char str[]=″I am happy″;char str[]={″I am happy″};与char str[]={′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′};的区别。前者的长度为11,后者的长度为10。
char str[20];
cin>>str; //用字符数组名输入字符串
cout<
C++提供了cin流中的getline函数,用于读入一行字符(或一行字符中前若干个字符),使用安全又方便。
在string和string.h头文件中定义相关字符及字符串的操作。
1、strcat(char[],const char[]);//函数调用后得到的函数值,就是第一个字符数组的地址。
2、字符串复制函数strcpy:strcpy(char[],const char[]);
(1)在调用strcpy函数时,第一个参数必须是数组名(如str1),第二个参数可以是字符数组名,也可以是一个字符串常量。
(2) 可以用strcpy函数将一个字符串中前若干个字符复制到字符数组中去。
(3) 只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。
3、strcmp(const char[],const char[]);
4、strlen(const char[]);//strlen是string length(字符串长度)的缩写。它是测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括′\0′在内。
二、C++处理字符串的方法——字符串类与字符串变量
1、基本概念
C++提供了一种新的数据类型——字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量—用一个名字代表一个字符序列。实际上,string并不是C++语言本身具有的基本类型,它是在C++标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是string类的一个对象。
string string1; //定义string1为字符串变量
string string2=″China″; //定义string2同时对其初始化
既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。如
string2=string1; //假设string2和string1均已定义为字符串变量,不要求string2和string1长度相同。
在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。
可以对字符串变量中某一字符进行操作,如
string word=″Then″; //定义并初始化字符串变量word
word[2]=′a′; //修改序号为2的字符,修改后word的值为″Than″
2、相关操作
cin>> string1; //从键盘输入一个字符串给字符串变量string1
cout<< string2; //将字符串string2输出
在以字符数组存放字符串时,字符串的运算要用字符串函数,如strcat(连接)、strcmp(比较)、strcpy(复制),而对string类对象,可以不用这些函数,而直接用简单的运算符。
(1) 字符串复制用赋值号
string1=string2;
其作用与“strcpy(string1,string2);”相同。
(2) 字符串连接用加号
string string1=″C++″; //定义string1并赋初值
string string2=″Language″; //定义string2并赋初值
string1=string1 + string2; //连接string1和string2
连接后string1为″C++ Language″。
(3) 字符串比较直接用关系运算符
可以直接用 ==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等关系运算符来进行字符串的比较。
也可以用string定义字符串数组。如
string name[5]; //定义一个字符串数组,它包含5个字符串元素
string name[5]={″Zhang″,″Li″,″Fun″,″Wang″,″Tan″}; //定义一个字符串数组并初始化。
在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。每一个字符串元素中只包含字符串本身的字符而不包括′\0′。
实际上,编译系统为每一个字符串变量分配4个字节,在这个存储单元中,并不是直接存放字符串本身,而是存放字符串的地址。在本例中,就是把字符串″Zhang″的地址存放在name[0],把字符串″Li″ 的地址存放在name[1],把字符串″Fun″的地址存放在name[2]……。在字符串变量中存放的是字符串的指针(字符串的地址)。
(补充)
1、声明一个C++字符串
声明一个字符串变量很简单:
string Str;
这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:
a) string s; //生成一个空字符串s
b) string s(str) //拷贝构造函数 生成str的复制品
c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值
d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
e) string s(cstr) //将C字符串作为s的初值
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g) string s(num,c) //生成一个字符串,包含num个c字符
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
i) s.~string() //销毁所有字符,释放内存
都很简单,我就不解释了。
2、字符串操作函数
这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。
a) =,assign() //赋以新值
b) swap() //交换两个字符串的内容
c) +=,append(),push_back() //在尾部添加字符
d) insert() //插入字符
e) erase() //删除字符
f) clear() //删除全部字符
g) replace() //替换字符
h) + //串联字符串
i) ==,!=,<,<=,>,>=,compare() //比较字符串
j) size(),length() //返回字符数量
k) max_size() //返回字符的可能最大个数
l) empty() //判断字符串是否为空
m) capacity() //返回重新分配之前的字符容量
n) reserve() //保留一定量内存以容纳一定数量的字符
o) [ ], at() //存取单一字符
p) >>,getline() //从stream读取某值
q) << //将谋值写入stream
r) copy() //将某值赋值为一个C_string
s) c_str() //将内容以C_string返回
t) data() //将内容以字符数组形式返回
u) substr() //返回某个子字符串
v)查找函数
w)begin() end() //提供类似STL的迭代器支持
x) rbegin() rend() //逆向迭代器
y) get_allocator() //返回配置器
basic_string substr(size_type pos = 0,size_type n = npos) const;
The member function returns an object whose controlled sequence is a copy of
up to n elements of the controlled sequence beginning at position pos.
const E *c_str() const;
The member function returns a pointer to a nonmodifiable C string
constructed by adding a terminating null element (E(0)) to the controlled
sequence. Calling any non-const member function for *this can invalidate the
pointer.
总之,C++对字符串的处理有两种方法: 一种是用字符数组的方法,这是C语言采取的方法,一般称为Cstring方法;一种是用string类定义字符串变量,称为string方法。