语言程序设计(7)_第1页
语言程序设计(7)_第2页
语言程序设计(7)_第3页
语言程序设计(7)_第4页
语言程序设计(7)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、C+语言程序设计Lecture 71第7章 字符串:分析文本计算机上的文本存储获取字符串字符串处理函数读取字符串输入字符与字符串新的C+ string 类一些例子27.1 计算机上的本文存储 任何数据在计算机中都是以二进制方式存储的插曲:数制文本也不例外,以ASCII码的方式转换为数值例如:char *str=“Hello!”;在内存中的形式为:何时会发生字符与数值的转换?输入字符时显示字符时37.2 获取正确的字符串字符串的本质是一个字符数组而字符类型(char)也可以理解为一个取值范围为0255的整型(int)可以以多种方式来声明字符串输出的情况 输出时,字符数组名或指针不会输出地址值,而

2、是输出字符串特别的,赋值str7=m;后牢记:字符串的结束标志为0char str10;str0=H;str1=e;str2=l;str3=l;str4=o;str5=!;str6=0;Str7=m;char str10=“Hello!”;char str=“Hello!”;char *p=“Hello!”;47.3 字符串处理函数我们已经使用过一些C+的库函数如sqrt,rand等常用的字符串函数:strcpy(s1,s2),strcat(s1,s2),strlen(s), strncpy(s1,s2,n),strncat(s1,s2,n),strcmp(s1,s2),strncmp(s1,

3、s2,n)char s80;strcpy(s,”One”);strcat(s,”Two”);strcat(s,”Three”);couts;注意:在使用字符串函数时要特别注意应有足够的内存空间存储字符串在内存中发生了什么?5这样的程序有问题吗?void main()char s1=”just”;char s2=“ a test”; strcpy(s1,s2); strcat(s1,s2); couts1“ “s2;67.4 示例:构建字符串功能:从用户输入获取字符串,然后以这些字符串为基础,构建一个大的字符串如何输入一行字符串呢?可以用cin吗?让我们来试试输入整行的方法:cin.getlin

4、e(str,len);将小字符串拼接起来的函数strcat(s1,s2);7完整的程序#include #includeusing namespace std;int main() char str600; char name100; char addr200; char work200; cout“Enter.”; cin.getline(name,99); cout“Enter.”; cin.getline(addr,199); cout“Enter.”; cin.getline(work,199); strcpy(str,”nMy name is “); strcat(str,name)

5、; strcat(str,”, I live at ”); strcat(str,addr); strcat(str,”nand I work at “); strcat(str,work); strcat(str,”.”); cout n输入一个整数时,在系统中会进行字符串到整数的类型转换cin也可以用于输入字符串,但前面已经说过,这样无法将空格输入,因此改用cin.getline()“.”的含义使用cin还有另外的问题任何未使用的输入都会留待下次执行时使用,这有时会带来意外的错误。无法使用输入默认值如果用户直接按回车,不输入任何东西,那么计算机会一直等下去让我们通过实例来观察一下97.6

6、示例:获取数字作用:用户输入数值时,输出它的平方根,如果用户没有输入直接按回车,则默认值为0.0,用户主动输入0时程序终止double get_number() char s100; cin.getline(s,99); if(strlen=0) return 0.0; return atof(s);atof的作用是将字符串转为浮点数 相应地,atoi是将字符串转为整数程序有问题吗? 验证一下 107.7 转换成大写功能:将用户输入的字符串转换为全部大写void convert_to_upper(char* s) int i; int length=strlen(s); for(i=0;ile

7、ngth;i+) si=toupper(si);不使用toupper函数可以吗?如何自己书写程序完成小写到大写的转换?请观察附录中的ASCII表11练习:P133 7.3.2重写转换成大写的程序,让它直接使用指针引用,而不是使用数组引用,如果抵达字符串末尾,那么当前字符为null终止符,即可以用*p=0来判断,也可以使用*p本身来判断12补充的练习:统计一行字符串中各字符出现的次数,输出各字符及个数13讨论需要用到的数据结构用一个字符数组(或字符指针)来保存用户输入的字符串char str100;用什么样的数据结构来记录每个字符的出现次数呢?还记得海盗跳海的例子吗?在那里我们用ai=1表示第i

8、个海盗跳海那么在这里,很自然地用counta=5的方式来表示字符a出现了5次,当然,我们或许需要一种“映射”字符到数组下标之间的映射我们需要吗?14可以来完成程序了吗?int main() char str100; int count128=0; int i=0; cout“Enter”; cin.getline(str,99); char c=str0; while(c!=0) i+; countc+; c=stri; for(int j=0;j0) cout(char)j“:”countjendl; return 0; 15上机练习稍复杂一些的情况:统计一行字符串中单词的数目(单词之间的分

9、隔可以是空格或除数字和字母外的其它标点符号)167.8 字符与字符串的比较在C+中,字符常量用单引号括起A字符串常量则用双引号(哪怕是一个字符的字符串),如”A”A只占一个字节,而“A”则占两个字节(为什么?)在正确的位置使用正确的表述char s = “A”;if(s0=A) cout“The first letter of the string isA.”;177.9 分析输入获取整行输入,然后分析它的内容以逗号作为分隔符将每个字符串片段存储在数组当中使用strtok函数可以直接完成类似功能,但仍然有必要写自定义函数完成它18思路将用户的输入放入一个字符串中,然后遍历这个字符串,遇到分隔符

10、,就把前面的一段内容放入一个字符串数组中,重复这个过程直到用户输入的字符串结束(即遍历到结束标志0),然后输出这个字符串数组19主要数据结构 用以存放用户输入的字符数组char buffer200思考:这里可以用字符指针而不用字符数组吗?为什么?用以存放各片段的字符串数组char strs10100使用二维数组char 和使用char *有什么不同呢?不清楚吗?那就暂时不理会它一个自定义函数int get_a_string(char * buffer,char * dest,int pos)将buffer字符串中从pos开始的第一个字符串片段(即从pos开始到第一次遇到分隔字符为止的内容)放入

11、dest中,并返回第一个未读字符的位置20get_a_string函数的实现int get_a_string(char * buffer,char * dest,int pos) int i=pos;int j=0; if(bufferi=0) return -1; while(bufferi!=, & bufferi!=0) destj=bufferi; i+;j+; destj=0; return i;21在主函数中使用get_a_stringint pos =0;int i=0;while(i10) pos=get_a_string(buffer,strsi,pos); if (pos=

12、-1) break; i+;让我们在开发环境中运行一下22讨论为什么运行得不对呢?当我们想了解程序运行状况的时候,最好的方法就是用一个实例去“逐行”地运行这个程序以用户输入”me,myself,and,i”为例找到问题所在了吗?如果将char buffer200换成 char * buffer会怎样?为什么?如果将char strs10100换成char * strs10会怎样?为什么?237.10 新的C+ string类string是一个“类”,还是一个“类型”?应该说,是“类类型”#include 表示添加了对string类的支持,而#include 则表示支持旧的字符串函数,如strc

13、mp等 string类也在命名空间std中24声明和初始化string类型的变量声明string a,b,c;初始化 string a(“Here is a string.”); 赋值a=“Here is a string”;25string 类型变量的处理在string类型的变量处理中,不需要为了拷贝内容或比较而使用函数string cat(“Persian”);string dog(“Dane”);dog = cat;if(cat = dog) coutname;/输入一个单词(到空格为止)使用getlinestring name;getline(cin,name);/输入整行,注意与前面

14、看到 /的getline的不同还记得吗?cin.getline(add,199);在string的getline中,不用输入最大字符数,其容量会自动调整277.11 使用string来构建字符串#include #include using namespace std;int main() string str,name,addr,work; cout“.”; getline(cin,name); cout“.”; getline(cin,addr); cout“.”; getline(cin,work); str=“My name is ”+name+”,”+”I live at”+addr

15、+”,nand I work at”+work+”.n”; coutstr; return 0;287.12 对string 类型的其他操作访问字符串中的字符string dog=“Dane”;cout dog0;/D获取长度string dog=“Dane”;cout dog.size();/4其他的函数assign,empty,find,insert,replace,swapP14429The time for gameHangman :a word game30Hangman将一系列单词存放在程序中,然后随机选出一个单词,让用户猜测该单词中的字母,如果玩家猜了6次还没猜出来所有字母,就算输了。31需要用到哪些数据结构?一个字符串数组string wordlistNUM 一个记录次数的变量guesses 一个字符串attempt ,它的长度与被猜的单词相同,但字符显示为_,当用户猜中一个字符中,将相应的_替换掉3

温馨提示

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

评论

0/150

提交评论