C++中字符串的介绍.doc_第1页
C++中字符串的介绍.doc_第2页
C++中字符串的介绍.doc_第3页
C++中字符串的介绍.doc_第4页
C++中字符串的介绍.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+中字符串的介绍字符串是个特殊的字符数组。与普通字符数组不同的是,字符串在结尾处有一个字符“0”,表示字符串的结束。在C+中字符串有特殊的初始化方式和专门的处理函数。本节将介绍字符串的特性,在下一节中将介绍专门用于处理字符串的函数。1.1字符串的特性1.1.1 什么是字符串在C+语言中,没有专门的字符串类型,一个字符串,其实就是一个字符数组。不过并不是数组中的所有字符都是字符串的一部分,字符串是以字符“0”表示字符串的结束的。所以在字符数组中,所有在字符0之前的字符才是字符串中的有效字符。字符串也有字面常量,其形式是用双引号包围起来一串字符。例如:HelloWorld;前面讲到的字符,用的是单引号,字符串用的是双引号,这点不要弄反了。a是一个字符串,而不是一个字符,虽然这个字符串只有一个有效字符。上面定义了一个字符串,其存储形式如图1.1所示。图1.1 字符串的存储形式每一个字符串,后面都有一个不可见的字符“0”,这个字符是字符串的结束标志。因此上面的字符串有12个字符。双引号表示其中的内容是一个字符串,字符串中并不包括双引号。前面讲字符类型的时候讲过转义字符,比如字符“n”表示换行。字符串中可以包含转义字符,例如:HellonWorld;如果输出上面的字符串,则会分两行输出。 表示只有空格字符的字符串,而也是一个字符串,这个字符串只有一个结束标志。字符串还可以分多行定义,例如:Hello World;上面的定义相当于HelloWorld,编译器会自动把分行定义的字符串连接起来。需要注意的是,只有在结束的时候才可以有语句结束的分号;,前面都不能有。字符串的结束标志不需要显式地提供,编译器会自动在后面追加。1.1.2 定义字符串用双引号包围的字符串是字符串类型的字面常量,不可以修改。而作为变量的字符串,其实就是字符数组。定义一个字符串其实就是定义一个字符数组,例如:charname10;/定义一个名字是name的字符串也可以定义二维的或者多维的字符数组,例如:charnames1010;/定义一个二维字符数组,通常称这样的数组为字符串数组1.1.3 字符串的初始化同普通数组一样,字符数组也允许在定义的时候直接初始化,例如:charname10=J,a,s,o,n;同样,如果为数组的所有元素提供了初始值,则字符数组的长度可以省略,例如:charname=J,a,s,o,n;这时数组长度被自动定义为5。还可以用字符串来作为字符数组的初始值,因此还可以这么写:charname=Jason;上面的语句定义了一个长度为6的字符数组,其最后的一个字符为“0”。在这种初始化方式下,不需要花括号和。通常用上面的方法对字符数组进行初始化,而不用单个字符的方式。1.1.4 操作字符串字符串作为一个字符数组,同样可以使用下标的方法来操作每一个字符,不过字符串有一些普通数组没有的特性。前面在介绍数组的时候提到过,cin和cout不可以直接操作数组,但是字符数组是个特例。可以直接用C+的标准输入cin输入整个数组的元素,用标准输出cout输出整个字符数组。下面对一个输入的字符串进行反转,其算法是:第一个字符和最后一个字符交换,第二个字符和倒数第二个字符交换,依此类推。假定字符串为abcdefg,那么其交换过程示意如下:ag bf ce d保持不变交换之后就成了gfedcba。交换到字符d时,也就是字符串一半的时候,这时的结果已经是gfedcba,交换已经完成了,如果继续再交换下去,则又会恢复成交换之前的样子。该实例的具体代码如示例代码6.4所示。示例代码6.4#includeusingnamespacestd;/使用名称空间std intmain(intargc,char*argv)/主函数 charbuffer128; /字符数组 cinbuffer; /输入字符串 intlen=(int)strlen(buffer); /取得字符串的长度 for(inti=0;ilen/2;i+)/遍历字符串 chartemp=bufferi;/交换两个字符 bufferi=bufferlen-i-1; bufferlen-i-1=temp; cout反转之后的字符串为:bufferendl;/输出提示信息 system(PAUSE);/等待用户反应 returnEXIT_SUCCESS;/主函数返回 建立一个控制台工程,并将上述代码复制到源文件中,编译并运行,其结果如图6.10所示。图1.2 字符串反转结果对于buffer0,其对应的要交换的为bufferlen-1,对于第i个字符bufferi,其需要交换的为bufferlen -i -1。最后来看循环结束的条件:如果字符串的长度len为偶数,最后一对需要交换的是bufferlen/2-1和bufferlen/2;如果字符串的长度len为奇数,bufferlen/2是中间字符,不需要交换,最后一对需要交换的字符是bufferlen/2-1和bufferlen/2+1。因此用条件ilen/2就可以保证交换完全并且没有多余的交换。1.1.5 字符串的数组也可以定义二维的字符数组,也就是字符串的数组。例如下面定义可以存储多个人名的数组:charnames1040;同普通的二维数组一样,字符串数组在定义的时候也可以初始化:charnames1040= Tom, Mary, Jacky, Jason ;上面定义了一个长度为10的字符串数组,并给前4个进行了初始化,剩余部分用空字符串来填充。不能遗忘两个字符串中间的,。1.2字符串处理函数虽然可以对字符数组用字符串进行初始化,可以直接输入、输出字符串,但是在使用字符数组的时候还是有很多不便,比如不能直接对字符数组进行赋值、不能比较两个字符数组的大小等。因此C+提供了一些函数来处理字符串,下面介绍几个常用的函数。1.2.1 字符串复制函数strcpy字符串是一个字符数组,因此它就有数组的局限性,不能用一个字符串给另外一个字符串赋值,例如:charname10; name=Jason;/错误,不可以这样直接赋值为了方便实现上面的功能,C+标准库中提供了strcpy函数,其定义格式为:strcpy(字符数组名1,字符数组名2)函数把字符数组2中的字符串复制到字符数组1中,串结束标志0也一同复制。使用例子如下:charstr1128,str2=HelloWorld; strcpy(str1,str2);/把str2复制到str1程序员需要自己保证str1的长度足够容纳str2的内容,如果str2的长度超过了str1的长度,可能会导致系统崩溃。其中第二个参数可以直接是一个字符串,因此也可以这样使用:charstr128; strcpy(str,HelloWorld);/直接给str赋值在下面的例子中需要用户输入两个字符串,然后把这两个字符串的内容互换,程序如示例代码2.1所示。#includeusingnamespacestd;/使用名称空间std intmain(intargc,char*argv)/主函数 cout请依次输入两个字符串:str1;/输入 cinstr2; cout第一个字符串为:str1endl; cout第二个字符串为:str2endl; coutendl交换两个字符串endl; chartemp128;/临时字符串变量 strcpy(temp,str1);/交换两个字符串 strcpy(str1,str2); strcpy(str2,temp); cout交换之后的字符串为:endlendl; cout第一个字符串为:str1endl; cout第二个字符串为:str2endl; system(PAUSE);/等待用户反应 returnEXIT_SUCCESS;/主函数返回 建立一个控制台工程,并将上述代码复制到源文件中,编译并运行,其结果如图2.1所示。图2. 1 交换字符串结果strcpy函数复制的是字符0之前的内容(包括这个结束标志),不是整个字符数组的内容。1.2.2 计算字符串长度函数strlen对于字符数组,可以通过sizeof来得到其定义的长度,但是这个长度对于字符串是没有意义的。因为通常想要得到的是其有效内容的长度,也就是在字符0之前的字符的个数。在C+标准库中提供了函数strlen,可以实现这个功能。strlen函数的格式如下:strlen(字符数组名)strlen将字符串的实际长度作为函数的返回值。使用例子如下:charstr128=HelloWorld; intlen=strlen(str);/取得字符串的长度上面的len值为11,包括里面的空格,但是不包括里面的字符串结束标志。下例中需要用户输入一个字符串,然后用strlen函数计算其长度,程序如示例代码2.2所示。#includeusingnamespacestd; intmain() cout请输入一个字符串:str; cout字符串的长度为:strlen(str)endl; return0; 建立一个控制台工程,并将上述代码复制到源文件中,编译并运行,其结果如图2.2所示。图2. 2 使用strlen函数示例结果1.2.3 字符串连接函数strcat对于两个整数a和b,下面的代码结果是把两个整数相加:inta=3; intb=5; intc=a+b;对于字符串,其加法的意义应该是把两个字符串连接起来,对于下面两个定义:charstr1128=HelloWorld; charstr2128=C+Programming;如果想把两个字符串连接起来,直接用+是不可以的,在C+标准库中提供了一个可以实现这个功能的函数,这个函数就是strcat。函数格式如下:strcat(字符数组名1,字符数组名2)函数把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志0。本函数返回值是字符数组1的首地址。使用例子如下:charstr1128=HelloWorld; charstr2128=C+Programming; strcat(str1,str2);/连接字符串上面的代码把str2连接到str1的后面,现在str1为Hello WorldC+ Programming。下例需要用户输入两个字符串,然后把它们连接起来,程序如示例代码2.3所示。#includeusingnamespacestd;/使用名称空间std intmain(intargc,char*argv)/主函数 cout请输入两个字符串:str1str2;/输入字符串 strcpy(buffer,str1);/复制 strcat(buffer,str2);/连接 cout新生成的字符串为:buffer字符串2,返回值0。字符串1字符串2,返回值0。当两个字符串相等的时候,返回值为0,因此,在比较两个字符串是否相等的时候,应当像下面的代码这么写:if(strcmp(str1,str2)=0)/判断两个字符串是否相同而不能这么写:if(strcmp(str1,str2)/错误的写法,结果跟希望正好相反下例需要用户输入两个字符串,然后对它们进行比较,程序如示例代码2.4所示。#includeusingnamespacestd; /使用名称空间std intmain(intargc,char*argv) /主函数 cout请输入两个字符串:str1str2;/输入字符串 intres=strcmp(str1,str2);/比较 cout比较的结果:endl;/输出比较结果 coutstr1; if(res=0)cout0)cout; if(res0)cout; coutstr2input; int flag=0; for(int i =0 ;i 0xa0 & inputi != 0) if(flag = 1) coutchinese character flag = 0; else flag+; else if(inputi = 0) break; else coutenglish character 内存中存放的Unicode码为:25105 1.3.4内码的相互转换(1)VC中的实现方法 利用Windows系统提供的API::MultiByteToWideChar和:WideCharToMultiByte :MultiByteToWideChar:实现当前码到Unicode码的转换; :WideCharToMultiByte:实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论