C语言程序设计-字符串结构_第1页
C语言程序设计-字符串结构_第2页
C语言程序设计-字符串结构_第3页
C语言程序设计-字符串结构_第4页
C语言程序设计-字符串结构_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第十一章字符串目标理解字符串常量理解字符数组和字符串的异同使用字符串输入/输出函数使用字符串处理函数理解指针与字符串的关系使用字符指针数组使用字符串作为函数参数2字符串简介chara='W';charb='a';charc='n';chard='g';chare='L';charf='i';如何让程序存储我的姓名?WangLicharname[15]={'W','a','n','g','L','i'};用若干个字符用字符数组用字符串3字符串常量字符串常量是双引号括起的任意字符序列"HelloWorld""WangPing""Pleaseenteryourfullname:""Hello\"Accp\""字符串常量中可以包含转义序列HelloWorld\0字符串结束符4字符串与字符数组在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串字符数组和字符串的区别是:字符串的末尾有一个空字符‘\0’字符串可按如下方式声明并初始化:charname[15]={'W','a','n','g','L','i','\0'};charname[15]="WangLi";charpassword[]="12345678";手工加入一个空字符系统将自动加入一个空字符省略数组大小,系统自动计算,大小为后面的字符总数加1,最后一个元素存入一个空字符。5字符串I/0函数3-1charname[10];scanf("%s",name);printf("%s",name);格式描述串中使用转换字符串“%s”WangLiWang\0使用scanf

时,不能输入空格Wang6字符串I/0函数3-2charname[10];gets(name);puts(name);WangLi\0WangLiWangLi从键盘上读入一个完整的行,存入字符数组name。并用空字符'\0'取代行尾的换行符'\n'。把字符数组中的字符串输出到显示器。使用gets函数允许输入空格7字符串I/0函数3-3puts函数完全可以由printf

函数取代。当需要按一定格式输出时,通常使用printf

函数。printf("\n

雇员姓名是:");puts(name);printf("\n

雇员所属部门是:");puts(dept);printf("\n

雇员姓名是:%s",name);printf("\n

雇员所属部门是:%s\n",dept);使用puts函数输出字符串使用printf函数输出字符串8字符串示例#include<stdio.h>voidmain(){charline[30];

int

i,count=0;

printf("\n

请输入一行字符:\n");

gets(line);i=0;

while(line[i]!='\0'){

if(line[i]=='') count++; i++;}

printf(“\n

其中的空格总数为

%d\n",count);}Cisaprogramminglanguage在循环执行时,扫描整个数组以统计出空格‘‘的数量,直到遇到字符’\0’。每次循环执行时,都会更新计数器i和count。其中的空格总数为49字符串处理函数

5-1与字符串有关的内置函数在头文件string.h中定义要使用标准库字符串处理函数,程序前应该包含:

#include<string.h>string.hstrlenstrcpystrcmpstrcat……10字符串处理函数5-2语法

strlen(s);描述计算字符串s中字符的个数,并将字符的个数作为函数的返回值。在计算字符个数时不计表示字符串结束的空字符'\0'。strlen#include<stdio.h>#include<string.h>voidmain(){chararr[]="Beijing";

intlen1,len2;

len1=strlen(arr);len2=strlen("Shanghai");

printf("\nstring=%slength=%d",arr,len1);

printf("\nstring=%slength=%d\n","Shanghai",len2);}string=Beijinglength=7string=Shanghailength=811字符串处理函数5-3语法

strcpy(dest,src)描述其中,dest是目标字符串,src是源字符串。相当于把字符数组src中的字符串拷贝到字符数组dest中。结束标志'\0'也一同拷贝。src可以是一个字符串常量。字符数组dest应足够大,以保证字符串复制不越界。strcpy#include<stdio.h>#include<string.h>voidmain(){ charsource[]="Wechangelives"; chartarget[20];

strcpy(target,source);

printf("\n

源字符串=%s",source);

printf("\n目标字符串=%s\n",target);}

源字符串=Wechangelives

目标字符串=Wechangelives12字符串处理函数5-4语法

strcmp(str1,str2)描述 按照ASCII码顺序比较字符串str1和str2的大小,比较的结果由函数返回。在两个字符串str1和str2相同时返回0;字符串str1大于字符串str2时返回一个正值,否则就返回负值。strcmp#include<stdio.h>#include<string.h>voidmain(){ charusername[15],pwd[15];

printf("\n

请输入用户名:");

gets(username);

printf("\n

请输入密码:");

gets(pwd);

if((strcmp(username,"John")==0)&&(strcmp(pwd,"123456")==0))

printf("\n

您已成功登录\n"); else

printf("\n

用户名和/或密码无效\n");}

请输入用户名:john

请输入密码:123456

用户名和/或密码无效

请输入用户名:John

请输入密码:123456

您已成功登录13字符串处理函数5-5语法

strcat(dest,src)描述把字符串src中的字符串连接到字符串dest中字符串的后面。本函数返回值是字符数组dest的首地址。连接后字符串的总长度将是字符串src

的长度加上字符串dest的长度。目标字符串dest的大小应足够存储最终的字符串。strcat#include<stdio.h>#include<string.h>voidmain(){ charsource_string[]="isverygood"; chartarget_string[30]="ACCP4.0";

strcat(target_string,source_string);

printf("\n

源字符串=%s",source_string);

printf("\n

目标字符串=%s\n",target_string);}

源字符串=isverygood

目标字符串=ACCP4.0isverygood14指向字符串的指针在C语言中,可以将字符指针指向字符串被指向的字符串可以是一个常量字符串,也可以是一个存储着字符串的字符数组char*ptr="CLanguage";CLanguage\0ptrchar*ps="Wechangelives";intn=10;ps=ps+n;printf("%s\n",ps);Wechanglives\0ps

lives15指向字符串的指针charuname[30]="wahaha

yiyiyaya";char*p;intcount;count=0;for(p=uname;*p!='\0';p++){ if(*p=='a') count++;}Wahahayiyiyaya\0psunamecount05循环16字符指针数组字符指针数组:一个数组中的各个元素都是字符指针char*names[]={"Apple","Pear","Peach","Banana"};Apple\0Pear\0Banana\0Peach\0EE05EE20EE44EE87names各字符串的首地址17字符指针数组示例voidmain(){

char*names[]={"Apple",

"Banana",

"Pineapple", "Peach", "Strawberry", "Grapes"};

char*temp;

printf(“\n%s%s",names[2],names[3]);

temp=names[2];

names[2]=names[3];

names[3]=temp;

printf("\n%s%s",names[2],names[3]);

printf("\n");}Apple\0Banana\0Peach\0Pineapple\0namesStrawberry\0Grapes\0temp

PineapplePeach

PeachPineapple55485562558355A855B355C9558355A8558318字符串作为函数参数voidmystrcpy(chardest[],charsrc[]){inti=0;while(src[i]!='\0'){ dest[i]=src[i]; i++;}dest[i]='\0';}用户定义版字符串拷贝函数int

mystrlen(char*s)

{

intn=0;while(*s!='\0'){++s;++n;}returnn;}用户定义版求字符串长度函数19ASCII编码表ASCII英文AmericanStandardCodeforInformationInterchange的缩写。ASCII码是目前计算机最通用的编码标准。因为计算机只能接受数字信息,ASCII码将字符作为数字来表示,以便计算机能够接受和处理。ASCII码:美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,

最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。

ASCII码于1968年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。

202122第十二章结构目标理解为什么使用结构定义结构声明结构变量访问结构成员掌握结构作为函数参数的用法24结构简介存储一个班级中5名学员的信息(学号、姓名、性别和成绩)问题:I.使用数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解决方案:scorenumsexname不能建立数组间的关系II.使用多维数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C语言不允许一个数组包含多种数据类型III.使用结构numnamesexscoreC语言引入了称为结构的数据存储方式“结构”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。25

定义结构2-1structstructurename{

datatypevariable1;

datatypevariable2; ...};结构成员{};结构名structstudentintnum;charname[20];charsex;定义结构floatscore;C语言中的有效数据类型26定义结构2-2structstudent{

intnum;charname[20];charsex;floatscore;};numnamesexstudent结构定义并不预留内存结构定义放置在程序的开始部分,位于头文件声明之后score结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。27声明结构变量声明结构变量structstudent{

intnum;charname[20];charsex;floatscore;};structstudentstudent1,student2;I.先定义结构,再声明结构变量structstudent{

intnum;charname[20];charsex;floatscore;}student1,student2;II.在定义结构类型的同时声明结构变量struct{

intnum;charname[20];charsex;floatscore;}student1,student2;III.直接声明结构变量声明一个类型为student结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。

28structdate{

intmonth;

intday;

intyear;};嵌套结构struct{

intnum;charname[20];charsex;

structdatebirthday;floatscore;}student1,student2;表示结构变量成员的一般形式是:结构变量名.成员名例如:student1.num、student2.sex、student1.birthday.month29内存student3structstudentstudent3={3,"YaoMing",'M',90.5};

结构变量初始化3YaoMingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。student3.sex90.5student3.score30student1student1.num=1;="ZhangZi

Liang";student1.sex=’M’;printf("请输入成绩:\n");scanf("%f",&student1.score);结构变量赋值1ZhangZi

LiangM用输入语句或赋值语句来给结构变量的各个成员赋值7878student2=student1;student21ZhangZi

LiangM7831问题描述:根据学员的成绩,输出不及格学员的详细信息。

使用结构示例#include<stdio.h>structstudent{

intnum;//学号 char*name;//姓名 charsex;//性别 floatscore;//成绩};voidmain(){staticstructstudentstu1={1,"李亚鹏",'M',61};staticstructstudentstu2={2,"周晶晶",'F',92.5};staticstructstudentstu3={3,"姚光明",'M',59};

printf("不及格学员的名单如下:\n");

if(stu1.score<60)

printf("%d\t%s\t%c\t%5.2f\n",stu1.num,,stu1.sex,stu1.score);

if(stu2.score<60)

printf("%d\t%s\t%c\t%5.2f\n",stu2.num,,stu2.sex,stu2.score);if(stu3.score<60)

printf("%d\t%s\t%c\t%5.2f\n",stu3.num,,stu3.sex,stu3.score);

if(stu1.score>=60&&stu2.score>=60&&stu3.score>=60)

printf("没有不及格的学员。\n");}不及格学员的名单如下:3姚光明M59.00stu11李亚鹏M78stu22周晶晶F92stu33姚光明M5932struct

stu*pstu;(*pstu).num或者:pstu->num结构指针变量一个指针当用来指向一个结构时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。结构指针变量声明的一般形式为:

struct

结构名*结构指针变量名通过结构指针可以访问该结构变量的成员,一般形式为:

(*结构指针变量).成员名或者结构指针变量->成员名

#include<stdio.h>structstudent{

intnum; char*name; charsex; floatscore;}stu={1,"张宾",'F',55},*pstu;voidmain(){

pstu=&stu;

printf("学号:%d姓名:%s\n",stu.num,);

printf("性别:%c成绩:%5.2f\n\n",stu.sex,stu.score);

printf("学号:%d姓名:%s\n",(*pstu).num,(*pstu).name);

printf("性别:%c成绩:%5.2f\n\n",(*pstu).sex,(*pstu).score);

printf("学号:%d姓名:%s\n",pstu->num,pstu->name);

printf(“性别:%c成绩:%5.2f\n\n",pstu->sex,pstu->score);}学号:1姓名:张宾性别:F成绩:55.00学号:1姓名:张宾性别:F成绩:55.00学号:1姓名:张宾性别:F成绩:55.00Pressanykeytocontinue33structstudent{

intnum;char*name;charsex;floatscore;}stu[30];结构数组元素为结构类型的数组称为结构数组。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构数组stu1,共有30个元素,stu[0]~stu[29]。每个数组元素都具有structstudent的结构形式。34问题描述:求学员的总成绩和平均成绩,并统计不及格人数。结构指针变量structstudent{

intnum; char*name; charsex; floatscore;}stu[N]={{1,"李芳",'F',45},{2,"于红",'F',62.5},{3,"何万山",'M',92.5},{4,"程亚丽",'M',87},{5,"王明",'M',58}};voidmain(){

int

i,count=0;floatave,sum=0;

for(i=0;i<N;i++) {

sum+=stu[i].score;

if(stu[i].score<60) count++; }

printf("总分:%7.2f\n",sum);

ave=sum/5;

printf("平均分:%5.2f\n",ave);

printf("不及格人数为:%d\n",count);}总分:345.00平均分:69.00不及格人数为:2Pressanykeytocontinue35结构作为函数参数可以将结构作为参数传递给函数,也可以定义返回结构值的函数。结构作为函数参数有三种不同方法:将结构成员的值传递给函数处理。将整个结构作为参数值传递给函数。将结构指针变量做函数的参数。把结构作为整体来处理,但作用方式和效果不同。36结构成员作为函数参数structfilm{charname[25];//电影名

chardirector[25];//导演

intduration;//片长};voiddisplay(char*,char*,int*);voidmain(){

structfilmf1;

printf("\n\t

请输入电影的详细信息");

printf("\n\n

请输入影片名:");gets();

fflush(stdin);

printf("\n

请输入导演姓名:");gets(f1.director);

fflush(stdin);

printf("\n

请输入电影片长(分钟):");scanf("%d",&f1.duration);

display(,f1.director,&f1.duration);}演示:示例4voiddisplay(char*n,char*d,int*m){

printf("\n\t

电影的详细信息\n");

printf("\n

片名:%s",n);

printf("\n

导演:%s",d);

printf("\n

片长:%d\n",*m);}前两个参数为字符串,所以不使用“&”37问题描述:求已知两个复数的和。分析:两个复数a+ib和c+id的和为:

x+iy

其中:x=a+cy=b+d#include<stdio.h>structcomplex{doublere;//实部

doubleim;//虚部};structcomplexadd(struct

complex,structcomplex);voidmain(){

structcomplexx={6.5,8.9},y={7.1,9.4};

structcomplexz;

z=add(x,y);

printf("和为:%5.2lf+i%5.2lf\n",z.re,z.im);}整个结构作为参数

演示:示例5structcomplexadd(structcomplexa,structcomplexb){

structcomplexc;

c.re=a.re+b.re;

c.im=a.im+b.im; returnc;}传递结构时不使用“&”,所以实际上是传值调用,即,将结构变量的每个成员值逐个传送。38结构指针做为参数

问题描述:求已知两个复数的和。分析:两个复数a+ib和c+id的和为:

x+iy

其中:x=a+cy=b+dstructstudent{

intnum;char*name;charsex;floatscore;}stu[N]={{1,"李芳",'F',45},{2,"于红",'F',62.5}, {3,"何万山",'M',92.5},{4,"程亚丽",'M',87}, {5,"王明",'M',58}};voidave(structstudent*ps);voidmain(){

structstudent*ps;

ps=stu;

ave(ps);}演示:示例6voidave(structstudent*ps){

int

i,count=0;floatave,sum=0;

for(i=0;i<N;i++,ps++){sum=sum+ps->score;

if(ps->score<60) count++;}

printf("总分:%7.2f\n",sum);

ave=sum/5;

printf("平均分:%5.2f\n",ave);

printf("不及格人数为:%d\n",count);}用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。39堆栈是一种先进后出的数据结构。用堆栈实现简单的行编辑功能,问题描述如下:接受用户从键盘输入的程序或数据,并存入用户的数据区。由于用户在键盘上进行输入时,不能保证不会出错,因此,需要设立一个输入缓冲区,允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符错了时,可以补进一个“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。实现堆栈5-140实现堆栈

5-2Whie使用堆栈实现行编辑功能whiel##lr#e(s#*s)llre(s*

温馨提示

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

评论

0/150

提交评论