字符串及应用_第1页
字符串及应用_第2页
字符串及应用_第3页
字符串及应用_第4页
字符串及应用_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、6.46.4字符串及应用字符串及应用 1.1.字符串的定义字符串的定义 字符串:带有全0结束符号的有限个字符的字符序列。2.2.字符串的书写表示字符串的书写表示 用双引号括起:computer,Begin等,“A”也是一个字符串,而a只是一个字符;在字符 串中空格也是有效字符。如My name is Time. 3.3.字符串的存储形式:字符串的存储形式: 以“computer”为例 如右图为什么以全0为字符串结束符? 因为任何有效字符的ASCII码值都不可能是全0!例例 问题问题 4.4.字符数组字符数组 1)含义:数组元素全部是字符的ASCII码值。2)定义(一般形式): char数组名元

2、素个数; char ch30; char str50; 或const char N=50; . char stringN;3)字符数组存储形式:存入字符的ASCII码,但不会自动补入全0符(0)。4)字符数组的输入与输出:用传统方式:下标方式,逐字符输入/输出。例例 5.5.字符串常量和字符串变量字符串常量和字符串变量 1)字符串常量:带结束符号的有限个字符的字符序列(结束符0)。2)字符串变量:先定义,后使用! 基类型为字符类型的数组变量(或用指向字符的指针表示)。 表示:以字符数组方式表示,但必有结束符03) 字符串长度:字符串中有效字符个数,其中包括空格及转义字符(全0结束符不计在内)。

3、 尽管转义字符在完全符合字符串中占了几个字符位置,但只当一个字符计算其长度。4)一个字符串常量的存储空间:字符串长度再加上一个结束符号0所占空间。 5)字符串变量初始化: 特别要注意存储空间大小,应包含结束符0的位置。 比较理想的形式:char name=Zhongshan University; 编译程序(C/C+)会自己设计出所需存储空间大小进行分配(已包含结束符0所占用位置)。 注意注意 6.6.字符串数组字符串数组 1)含义:数组元素均为字符串。(实际上是一个二维数组) 2)缺陷(字符串) 数组定义时必须确定数组(字符串)长度,当出现长度大于预定长度时,就引起越界存储错误。 当实际字符

4、串长度小于预定长度时,就造成浪费。3)改进办法:把字符串数组转化为指针数组 7.7.常用字符串处理函数常用字符串处理函数 文件包含#include1)求字符串长度:unsigned int strlen(const char* str); 功能:求string所指字符串的字符个数(不计0)2)字符串复制:char* strcpy(char* str1,const char* str2); 功能:把str2所指字符串复制到str1所指区域中去。 当str2所指字符中长度大于str1所指区域的长度时,会出现越界写入错误(str1必须经过初始化)。注意注意 3)字符串中连接:char* strcat

5、(char* s,const char* t); 功能:把t所指字符串连接到s所指字符串末尾,形成一个新字符串。传统的连接函数执行是有风险的,因为当s所指字符串所分配的空间不够时,指针t所指字符串连接过来就造成了越界存储,数组的越界访问是难以发现且相当危险的事情,因为它可能改变其它存储空间的内容(字符串复制函数strcpy()也存在这个问题)。解决的方法是利用动态空间申请new和动态空间撤销delete,根据实际需要合理地分配存储空间(关于new和delete,将在后面一节介绍)下面给出后的新字符串连接函数:#includechar* sstrcat(char* ss, const char*

6、 tt)int m, n; char* t; char*str;m=strlen(ss); n=strlen(tt);t=new charn+1;str=new charm+n+1;t=strcpy(t,tt);str=strcpy(str,ss);str=strcat(str,t);delete ss; delete t;return str;根据类似思想,读者不难自己设计出strcpy()改进方案4)字符串比较(依字典排序):int strcmp(const char* s,const char* t); 5)输入一字符串: 例: 设已有char strN;设N够大 int gets(st

7、r); 6)输出str所指字符串:int puts(str); (设有char strN;(N 足够大),可用:cinstr;.cout来实现。在某些特殊场合中,可能无法借助人工外部输入来为程序执行提供数据,而希望程序能自动从执行程序的命令行中来获得执行所需的数据。(2)命令行是什么?下面以一个Dos操作系统的命令为例。在Dos环0境下,我们经常使用形如下述的命令来复制文件: copy a:filea.dat d:filed.dat在这一个命令行中,copy是复制文件的命令(实际是执行程序名);而a:filea.dat和d:filed.dat是两个执行参数。这一个命令的含义是:把a盘中的fil

8、ea.dat复制到d盘中并以filed.dat命名。复制结束后,a盘中的filea.dat文件和d盘中的filed.dat文件内容相同。 要完成复制工作,就要执行复制程序,并从命令行中获得源文件和目标文件的信息。人们只需要发出上述的复制命令,程序被执行时,操作系统将自动读取所给出的参数并执行。 若把copy也当作一个参数,则上述命令中包含了三个参数段:命令段copy;源文件a:filea.dat;目标文件d:filed.dat,总共三个参数段,缺一不可。(3)数字字符串转换成整数或实数如果程序执行时所需要的参数不是字符串而是整数或实数时,我们还得想办法把数字字符串转换为整数或实数。C和C+已为

9、我们提供了这些转换函数,它们被组织在stdlib.h里面。以下是常用转换函数原型:把指针S所指向的数字字符串转换为整数(int)int atoi(const char*s);把指针S所指向的数字字符串转换成实数(double)double atof(const char*s);把指针S所向数字字符串转换成长整型数(long)long atol(const char*s);(4)主函数带参数的形式主函数带参数主要有两种形式:int main(int argc,char* argv);int main(int argc,char* argv,char* env);其中,argc是一个整数,表示传给

10、主函数的命令行参数个数,其实际值是实际参数加1(把命令本身也当作一个参数);argv是一个指针数组,argv0指向命令名(包含路径);argv1指向执行程序名后的第一个参数,argv2为执行程序名后的第二个参数,.以此类推。env也是一个指针数组,env的每一个元素将指示相关的环境值(作为一般用户实际没有必要去详细了解它)。也可以使用其他用户自定义标识符来作为主函数形参表中的形参名。(5)主函数带参数的例子(主函数带2个参数)设计一个名为sumint的程序。其功能为:在编译、连接获得可执行文件sumint.exe以后,在操作系统环境下,输入 sumint m n 以后,程序就自动计算从m到n之

11、间的所有自然数之各并输出(其中,0mn32000)。设输入为sumint 15 31200 则执行程序时,系统会自动计数得argc为3;而其它参数则如下图所示:指针数组argv各元素分别指向各参数段(字符串形式)。值得注意的是,程序执行时要求以自然数形式进行计算,所以就要求把数字字符串转换为整数。综上所述,可得到如下程序:#include /文件名sumint.cpp#include /使用形式sumint m nvoid main(int argc,char* argv) /不必观察运行参数 int m,n,i;long sum=0; if(argc!=3) coutnUsage:sumin

12、t m nn; return; m=atoi(argv1;n=atoi(argv2); /转换操作数 if(m=n)|(n=32000) coutnInput error.(0mn32000)n; return; for (i=m;i=n;i+) sum=sum+i; /累加 coutThe sum:sumendl;(6)主函数带参数的第二个例子(主函数带三个参数)设计出一个名为calcul.cpp的程序,编译、连接得到可执行文件calcul.exe,在操作系统环境下,输入: calcul 操作数1 运算符 操作数2 以后,能自动判别完成计算并输出结果。其中运算符只能是+,-,*,/;要求完成

13、计算的同时,输出相关参数供程序员分析。根据前面介绍的原则,不难得到下面的程序。#include /程序名:calcul.cpp#include /使用: calcul m 运算符 n#includevoid main(int argc,char* argv,char* env) char opr,str81; double result,first,second; if(argc!=4) /检查参数段是否正确 coutnUsage:number1 operator number2n; exit(0); coutArgc=argcendl; /输出参数段数 coutArgv0:argv0endl

14、; /输出各参数 coutArgv1:argv1endl; coutArgv2:argv2endl; coutArgv3:argv3endl; coutEnv0:env0endl; /输出运行环境 coutEnv1:env1endl; /参数,供参考 coutEnv2:env2endl; /也可不必查看 coutEnv3:env3endl; /此类参数 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

温馨提示

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

评论

0/150

提交评论