《6.4字符串及应用.ppt》由会员分享,可在线阅读,更多相关《6.4字符串及应用.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、6.46.4字符串及应用字符串及应用 1.1.字符串的定义字符串的定义 字符串:带有全0结束符号的有限个字符的字符序列。2.2.字符串的书写表示字符串的书写表示 用双引号括起:computer,Begin等,“A”也是一个字符串,而a只是一个字符;在字符串中空格也是有效字符。如MynameisTime.3.3.字符串的存储形式:字符串的存储形式:以“computer”为例如右图为什么以全0为字符串结束符?因为任何有效字符的ASCII码值都不可能是全0!例例 问题问题 4.4.字符数组字符数组 1)含义:数组元素全部是字符的ASCII码值。2)定义(一般形式):char数组名元素个数;charc
2、h30;charstr50;或constcharN=50;.charstringN;3)字符数组存储形式:存入字符的ASCII码,但不会自动补入全0符(0)。4)字符数组的输入与输出:用传统方式:下标方式,逐字符输入/输出。例例 5.5.字符串常量和字符串变量字符串常量和字符串变量 1)字符串常量:带结束符号的有限个字符的字符序列(结束符0)。2)字符串变量:先定义,后使用!基类型为字符类型的数组变量(或用指向字符的指针表示)。表示:以字符数组方式表示,但必有结束符03)字符串长度:字符串中有效字符个数,其中包括空格及转义字符(全0结束符不计在内)。尽管转义字符在完全符合字符串中占了几个字符位
3、置,但只当一个字符计算其长度。4)一个字符串常量的存储空间:字符串长度再加上一个结束符号0所占空间。5)字符串变量初始化:特别要注意存储空间大小,应包含结束符0的位置。比较理想的形式:charname=ZhongshanUniversity;编译程序(C/C+)会自己设计出所需存储空间大小进行分配(已包含结束符0所占用位置)。注意注意 6.6.字符串数组字符串数组 1)含义:数组元素均为字符串。(实际上是一个二维数组)2)缺陷(字符串)数组定义时必须确定数组(字符串)长度,当出现长度大于预定长度时,就引起越界存储错误。当实际字符串长度小于预定长度时,就造成浪费。3)改进办法:把字符串数组转化为
4、指针数组7.7.常用字符串处理函数常用字符串处理函数 文件包含#include1)求字符串长度:unsignedintstrlen(constchar*str);功能:求string所指字符串的字符个数(不计0)2)字符串复制:char*strcpy(char*str1,constchar*str2);功能:把str2所指字符串复制到str1所指区域中去。当str2所指字符中长度大于str1所指区域的长度时,会出现越界写入错误(str1必须经过初始化)。注意注意 3)字符串中连接:char*strcat(char*s,constchar*t);功能:把t所指字符串连接到s所指字符串末尾,形成一
5、个新字符串。传统的连接函数执行是有风险的,因为当s所指字符串所分配的空间不够时,指针t所指字符串连接过来就造成了越界存储,数组的越界访问是难以发现且相当危险的事情,因为它可能改变其它存储空间的内容(字符串复制函数strcpy()也存在这个问题)。解决的方法是利用动态空间申请new和动态空间撤销delete,根据实际需要合理地分配存储空间(关于new和delete,将在后面一节介绍)下面给出后的新字符串连接函数:#includechar*sstrcat(char*ss,constchar*tt)intm,n;char*t;char*str;m=strlen(ss);n=strlen(tt);t=
6、newcharn+1;str=newcharm+n+1;t=strcpy(t,tt);str=strcpy(str,ss);str=strcat(str,t);deletess;deletet;returnstr;根据类似思想,读者不难自己设计出strcpy()改进方案4)字符串比较(依字典排序):intstrcmp(constchar*s,constchar*t);5)输入一字符串:例:设已有charstrN;设N够大intgets(str);6)输出str所指字符串:intputs(str);(设有charstrN;(N足够大),可用:cinstr;.cout来实现。在某些特殊场合中,可能
7、无法借助人工外部输入来为程序执行提供数据,而希望程序能自动从执行程序的命令行中来获得执行所需的数据。(2)命令行是什么?下面以一个Dos操作系统的命令为例。在Dos环0境下,我们经常使用形如下述的命令来复制文件:copya:filea.datd:filed.dat在这一个命令行中,copy是复制文件的命令(实际是执行程序名);而a:filea.dat和d:filed.dat是两个执行参数。这一个命令的含义是:把a盘中的filea.dat复制到d盘中并以filed.dat命名。复制结束后,a盘中的filea.dat文件和d盘中的filed.dat文件内容相同。要完成复制工作,就要执行复制程序,并
8、从命令行中获得源文件和目标文件的信息。人们只需要发出上述的复制命令,程序被执行时,操作系统将自动读取所给出的参数并执行。若把copy也当作一个参数,则上述命令中包含了三个参数段:命令段copy;源文件a:filea.dat;目标文件d:filed.dat,总共三个参数段,缺一不可。(3)数字字符串转换成整数或实数如果程序执行时所需要的参数不是字符串而是整数或实数时,我们还得想办法把数字字符串转换为整数或实数。C和C+已为我们提供了这些转换函数,它们被组织在stdlib.h里面。以下是常用转换函数原型:把指针S所指向的数字字符串转换为整数(int)intatoi(constchar*s);把指针
9、S所指向的数字字符串转换成实数(double)doubleatof(constchar*s);把指针S所向数字字符串转换成长整型数(long)longatol(constchar*s);(4)主函数带参数的形式主函数带参数主要有两种形式:intmain(intargc,char*argv);intmain(intargc,char*argv,char*env);其中,argc是一个整数,表示传给主函数的命令行参数个数,其实际值是实际参数加1(把命令本身也当作一个参数);argv是一个指针数组,argv0指向命令名(包含路径);argv1指向执行程序名后的第一个参数,argv2为执行程序名后的第
10、二个参数,.以此类推。env也是一个指针数组,env的每一个元素将指示相关的环境值(作为一般用户实际没有必要去详细了解它)。也可以使用其他用户自定义标识符来作为主函数形参表中的形参名。(5)主函数带参数的例子(主函数带2个参数)设计一个名为sumint的程序。其功能为:在编译、连接获得可执行文件sumint.exe以后,在操作系统环境下,输入sumintmn以后,程序就自动计算从m到n之间的所有自然数之各并输出(其中,0mn32000)。设输入为sumint1531200则执行程序时,系统会自动计数得argc为3;而其它参数则如下图所示:指针数组argv各元素分别指向各参数段(字符串形式)。值
11、得注意的是,程序执行时要求以自然数形式进行计算,所以就要求把数字字符串转换为整数。综上所述,可得到如下程序:#include/文件名sumint.cpp#include/使用形式sumintmnvoidmain(intargc,char*argv)/不必观察运行参数intm,n,i;longsum=0;if(argc!=3)coutnUsage:sumintmnn;return;m=atoi(argv1;n=atoi(argv2);/转换操作数if(m=n)|(n=32000)coutnInputerror.(0mn32000)n;return;for(i=m;i=n;i+)sum=sum+i
12、;/累加coutThesum:sumendl;(6)主函数带参数的第二个例子(主函数带三个参数)设计出一个名为calcul.cpp的程序,编译、连接得到可执行文件calcul.exe,在操作系统环境下,输入:calcul操作数1运算符操作数2以后,能自动判别完成计算并输出结果。其中运算符只能是+,-,*,/;要求完成计算的同时,输出相关参数供程序员分析。根据前面介绍的原则,不难得到下面的程序。#include/程序名:calcul.cpp#include/使用:calculm运算符n#includevoidmain(intargc,char*argv,char*env)charopr,str8
13、1;doubleresult,first,second;if(argc!=4)/检查参数段是否正确coutnUsage:number1operatornumber2n;exit(0);coutArgc=argcendl;/输出参数段数coutArgv0:argv0endl;/输出各参数coutArgv1:argv1endl;coutArgv2:argv2endl;coutArgv3:argv3endl;coutEnv0:env0endl;/输出运行环境coutEnv1:env1endl;/参数,供参考coutEnv2:env2endl;/也可不必查看coutEnv3:env3endl;/此类参
14、数coutExp:argv1argv2argv3endl;/输出原来输入的表达式,供检查first=atof(argv1);/转换参加运算的数second=atof(argv3);strcpy(str,argv2);/获取运算符opr=str0;switch(opr)/判别执行什么运算case+:result=first+second;break;case-:result=first-second;break;case*:result=first*second;break;case/:if(second!=0)result=first/second;break;default:coutnErrornumber(s)oroperator.n;exit(0);coutResult:resultendl;通常情况下,用户一般不必去关心运行环境参数,所以主函数参数表中也不必设立对应的形式参数。程序执行时也不必安排相关的操作。上一节返回下一节