深⼊解析C++中的字符数组和处理字符串的⽅法
C++字符数组
⽤来存放字符数据的数组是字符数组,字符数组中的⼀个元素存放⼀个字符。字符数组具有数组的共同属性。由于字符串应⽤⼴泛,C和C++专门为它提供了许多⽅便的⽤法和函数。
字符数组的定义和初始化
定义字符数组的⽅法与前⾯介绍的类似。例如:
char c[10];
c[0]=′I′;c[1]=′′;c[2]=′a′;c[3]=′m′;c[4]=′′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′;
上⾯定义了c为字符数组,包含10个元素。在赋值以后数组的状态如图所⽰。
对字符数组进⾏初始化,最容易理解的⽅式是逐个字符赋给数组中各元素。如
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
把10个字符分别赋给c[0]~c[9]这10个元素。
如果花括号中提供的初值个数⼤于数组长度,则按语法错误处理。如果初值个数⼩于数组长度,则只将这些字符赋给数组中前⾯那些元素,其余的元素⾃动定为空字符。如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会⾃动根据初值个数确定数组长度。如:
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};
也可以定义和初始化⼀个⼆维字符数组,如
复制代码代码如下:
char diamond[5][5]={{' ',' ','*'},{' ', '*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};
字符数组的赋值与引⽤
只能对字符数组的元素赋值,⽽不能⽤赋值语句对整个数组赋值。如:
char c[5];
c={'C','h','i','n','a'}; //错误,不能对整个数组⼀次赋值
c[0]='C'; c[1]='h';c[2]='i';c[3]='n';c[4]='a'; //对数组元素赋值,正确
如果已定义了a和b是具有相同类型和长度的数组,且b数组已被初始化,请分析:
a=b; //错误,不能对整个数组整体赋值
a[0]=b[0]; //正确,引⽤数组元素
【例】设计和输出⼀个钻⽯图形。
#include <iostream>
using namespace std;
void main( )
{
char diamond[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};
int i,j;
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
cout<<diamond[i][j]; //逐个引⽤数组元素,每次输出⼀个字符
cout<<endl;
}
}
C++处理字符串的⽅法—字符串类与字符串变量
⽤字符数组来存放字符串并不是最理想和最安全的⽅法。
C++提供了⼀种新的数据类型——字符串类型(string类型),在使⽤⽅法上,它和char、int类型⼀样,可以⽤来定义变量,这就是字符串变量——⽤⼀个名字代表⼀个字符序列。
实际上,string并不是C++语⾔本⾝具有的基本类型,它是在C++标准库中声明的⼀个字符串类,⽤这种类可以定义对象。每⼀个字符串变量都是string类的⼀个对象。
字符串变量的定义和引⽤
1) 定义字符串变量
和其他类型变量⼀样,字符串变量必须先定义后使⽤,定义字符串变量要⽤类名string。如:
string string1; //定义string1为字符串变量
string string2=″China″; //定义string2同时对其初始化
应当注意:要使⽤string类的功能时,必须在本⽂件的开头将C++标准库中的string头⽂件包含进来,即应加上
#include <string> //注意头⽂件名不是string.h
2) 对字符串变量的赋值c++strcpy函数用法
在定义了字符串变量后,可以⽤赋值语句对它赋予⼀个字符串常量,如:
string1=″Canada″;
既可以⽤字符串常量给字符串变量赋值,也可以⽤⼀个字符串变量给另⼀个字符串变量赋值。如:
string2=string1; //假设string2和string1均已定义为字符串变量
不要求string2和string1长度相同,假如string2原来是″China″,string1原来是″Canada″,赋值后string2也变成″Canada″。在定义字符串变量时不需指定长度,长度随其中的字符串长度⽽改变。
可以对字符串变量中某⼀字符进⾏操作,如:
string word=″Then″; //定义并初始化字符串变量word
word[2]=′a′; //修改序号为2的字符,修改后word的值为″Than″
3) 字符串变量的输⼊输出
可以在输⼊输出语句中⽤字符串变量名,输⼊输出字符串,如:
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定义字符串数组。如:
string name[5]; //定义⼀个字符串数组,它包含5个字符串元素
string name[5]={″Zhang″, ″Li″, ″Fun″, ″Wang″, ″Tan″}; //定义⼀个字符串数组并初始化
此时name数组的状况如图所⽰。
关于字符串数组的⼏点说明:
在⼀个字符串数组中包含若⼲个(现为5个)元素,每个元素相当于⼀个字符串变量。
并不要求每个字符串元素具有相同的长度,即使对同⼀个元素⽽⾔,它的长度也是可以变化的,当向某⼀个元素重新赋值,其长度就可能发⽣变化。
在字符串数组的每⼀个元素中存放⼀个字符串,⽽不是⼀个字符,这是字符串数组与字符数组的区别。如果⽤字符数组存放字符串,⼀个元素只能存放⼀个字符,⽤⼀个⼀维字符数组存放⼀个字符串。
每⼀个字符串元素中只包含字符串本⾝的字符⽽不包括′\0′。
可见⽤字符串数组存放字符串以及对字符串进⾏处理是很⽅便的。
在定义字符串数组时怎样给数组分配存储空间呢?实际上,编译系统为每⼀个字符串变量分配4个字节,在这个存储单元中,并不是直接存放字符串本⾝,⽽是存放字符串的地址。在本例中,就是把字符串″Zhang″的地址存放在name[0],把字符串″Li″的地址存放在name[1],把字符串″Fun″的地址存放在name[2]……上只是⼀个⽰意图。在字符串变量中存放的是字符串的指针(字符串的地址)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论