第07章字符串及其应用(12级)_第1页
第07章字符串及其应用(12级)_第2页
第07章字符串及其应用(12级)_第3页
第07章字符串及其应用(12级)_第4页
第07章字符串及其应用(12级)_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

程序设计技术C语言数据描述和C程序设计初步

结构化程序设计基础和C语言的控制结构

数组及其应用

函数与C程序结构

指针与函数

指针与数组

字符串及其应用结构体类型和联合体类型C语言的文件处理及其应用位运算与枚举类型字符串及其应用C语言的字符串表示方法字符串的常用处理方法及标准库函数

字符串的表示方法有两种

因为c语言中没有字符串这种数据类型,只有字符串常量,没有字符串变量,所以对字符串的处理一般采用两种方法:利用字符数组利用指向字符变量的指针(串指针)

7.1.1字符串表示方法一般的字符数组一个一个存放字符数据的数组就称为字符数组,可使用字符数组实现对字符串的处理。字符数组的定义:char数组名[长度]

例如:charstr[7]={’a’,’b’,’c’,’d’,’e’,’f’,’g’};

abcdefgstr图7.2数组名与其初始化值之间的对应关系又如:charstr[7]={’a’,’b’,’c’,’d’,’e’};abcde\0\0str图7.2数组名与其初始化值之间的对应关系7.1.1字符串表示方法用字符数组处理字符串时

字符数组的定义:char数组名[长度]

注意:存放字符串时要使用空字符’\0’作为字符串的结束符号,所以定义字符数组处理字符串时,应使字符数组长度大于或等于字符串的有效长度加1。例如:charstr[7]=”abcdef”;

abcdef\0str图7.2数组名与其初始化值之间的对应关系7.1.1字符串表示方法指向字符变量的指针(串指针)

定义字符指针变量,并将字符串或字符串常量的首地址赋给该指针变量。即字符指针变量指向一个字符串。例如:char*sPtr=“abcd”;

sPtr=“1234”;

系统内存会分配一段连续的存储区域来存放指定的字符串常量,然后将该存储区域的起始地址(字符串常量的首地址)赋值给字符指针变量sPtr。第2个赋值语句sPtr=”1234”;使指针变量sPtr由指向字符串”abcd”改为指向字符串”1234”。

abcd\0sPtra)指针变量指向字符串常量abcd\0abcd\0sPtrb)指针变量改变原指向指向另一字符串1234\0图7.1指针变量与字符串数据对象的关系示意图7.1.1字符串表示方法chars1[]=“abcd”;char*s2=“abcd”;chars1[10],*s2;s1=“abcd”;s2=“abcd”;

比较chars1[10],*s2;gets(s1);gets(s2);char*s2;s2=(char*)malloc(10);gets(s2);比较

字符数组与字符指针的区别7.1.1字符串表示方法XX7.1.2字符串的输入输出使用scanf、printf函数⑴使用格式控制符%c可以通过单个字符方式输入输出字符数组。(chara[6],b[8],c[5];)

for(i=0;i<6;i++)scanf(“%c”,&a[i]);for(i=0;i<6;i++)printf(“%c”,a[i]);⑵使用格式控制符%s可以将整个字符串一次输入输出,并且一次可以输入输出多个字符串。(函数参数为字符数组名或串指针)

scanf(“%s”,a);/*整体输入一个字符串*/

printf(“%s”,a);/*整体输出一个字符串*/使用gets、puts函数

(函数参数为字符数组名或串指针)使用gets和puts函数一次可以输入输出一个字符串。7.1.2字符串的输入输出scanf和gets函数的区别一次调用能够输入的字符串个数不同gets(a);/*输入1个字符串*/scanf(“%s%s%s”,a,b,c);/*输入多个字符串(空格分隔)*/空格字符的处理不同

gets

输入字符串中可含有空格字符。

scanf

输入字符串中不能含空格字符(难以得到预期结果)。printf和puts函数的区别一次调用能够输出的字符串个数不同

puts(a);/*输出1个字符串*/

printf(“%s\n%s\n%s”,a,b,c);/*输出多个字符串*/输出数据换行处理方式不同

puts函数输出字符串后会自动换行;

printf函数输出字符串后不自动换行;

gets(a);abcdegets(b);1234gets(c);GDASputs(a);puts(b);puts(c);abcde1234GDASGDAS就被截掉了。例7-2

将字符串中小写字母转变成大写字母#include<stdio.h>voidmain(){ charstring[100],*p; printf("Pleaseinputastring:"); gets(string);

p=string; while(*p!='\0') {if(*p>='a'&&*p<='z') *p-=32;

p++; } printf("Thenewstringis:"); puts(string);}7.1.2字符串的输入输出例7-2程序演示

pabcdefg\0stringP*pAB*ppCDEFG字符串及其应用C语言的字符串表示方法字符串的常用处理方法及标准库函数字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.1字符串中有效字符的统计测试字符串的长度

统计字符串中包含的有效字符个数。即从字符串的第一个字符开始,依次向后判断该字符是否字符串结束符’\0’,若不是则予以统计,直到遇到’\0’为止。标准测试字符串长度函数strlen

函数原型:在<string.h>中

size_tstrlen(constchar*string)

其中:size_t表示无符号整数数据类型函数调用:strlen(str);功能:测试str的字符串长度。返回值为字符串的实际长度,不包括结束字符’\0’。a[]a

参数应该是个地址,如:数组名或串指针等。47.2.1字符串中有效字符的统计(P218)例7-5编程序实现功能:判断输入字符串是否回文。

回文:左读或右读都相同。如:level是回文。level\0wordfor(;head<end;head++,end--) if(*head!=*end) { flag=0; break; }if(flag)printf("%s是回文!",word);elseprintf("%s不是回文!",word);headendheadendabcde\0headendgets(word);len=strlen(word);head=word;end=head+len-1字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.2字符串的复制标准字符串复制函数strcpy

函数原型:在<string.h>中

char*strcpy(char*strDestination,const*strSource)

函数调用:strcpy(str1,str2);

功能:将字符串str2拷贝到字符串str1中,函数返回字符串str1。其中,字符数组str1必须定义足够大,str2可以是字符串常量。

返回值是个地址两个参数也是地址源字符串目标字符串例7-7使用标准函数strcpy实现字符串的拷贝*s1,*s2;该指针悬空,出错!使用标准字符串复制函数的注意点字符串复制函数使用的字符数组形参本质上是一个指针量,对应的实参必须是地址量(数组名或已经指向某串的串指针等)。可以将实参字符数组(字符串)的部分提供给形参数组共享。字符串存储时,系统会自动添加字符串结束符’\0’,程序处理字符串时,只需指出开始位置。7.2.2字符串的复制

例7-8

编程将源字符串从指定位置拷贝到目标字符串

#include<stdio.h>#include<string.h>voidmain()

{ chars1[80],s2[80]; intpos; printf("Inputthestrings1:"); gets(s1); printf("Inputthepos:"); scanf("%d",&pos); strcpy(s2,&s1[pos]);//strcpy(s2,s1+pos); puts(s2);}7.2.2字符串的复制abcde\0s1s222s1+2(&s1[2])cde\07.2.2字符串的复制voidmain(){ chars[100]; intstart,len,length; gets(s); scanf("%d",&start);scanf("%d",&length); len=strlen(&s[start]); if(len<length) strcpy(s+start,s+strlen(s)); else strcpy(s+start,s+start+length); puts(s);}P221例7-9

演示abcmnkdef\0s

def\0

37Len=636s+6s+3633字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.3字符串的连接字符串连接的基本思想首先找到目标字符串的结尾处,然后从源字符串的第一个字符开始依次取出每一个有效字符赋值到指定目标位置,直到源字符串的字符处理完为止。标准字符串连接函数strcat

函数原型:

char*strcat(char*strDestination,char*strSource);函数调用:strcat(str1,str2);

功能:将字符串str2连接到字符串str1的后面生成新的字符串str1,函数返回字符串str1。字符数组长度应足够大(大于或等于strlen(str1)+strlen(str2))。

例7-12

编程将源字符串从指定位置连接到目标字符串abcdABCDefg4abcdefg4字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.4字符串中字符的查找

基本思想:字符串中字符的查找就是按照指定方向寻找指定字符第一次在字符串中出现的位置。从查找方向分为正向查找(从串首至串尾)反向查找(从串尾至串首)从获取被查找字符位置信息分为返回下标序号方式(自定义函数才能实现)返回存放地址方式(调用标准函数实现)标准字符查找函数strchr

函数原型:

char*strchr(constchar*string,intc);

函数调用:

strchr(str,ch);

函数功能:

正向在字符串str中查找字符ch,若ch存在则返回其在字符串中首次出现的地址,否则返回NULL。7.2.4字符串中字符的查找7.2.4字符串中字符的查找函数:返回被查找字符在串中的下标序号intsearch_chr(chars[],charc){ inti; for(i=0;s[i]!='\0';i++) if(s[i]==c) returni; return-1;}例7-13

编制函数实现功能:在字符串中正向查找指定字符,并用主函数测试。

函数:返回被查找字符在串中的存放地址char*search_chr(chars[],charc){ inti=0; for(;s[i]!='\0';i++) if(s[i]==c) return&s[i]; returnNULL;}7.2.4字符串中字符的查找for(i=0,j=0;s1[i]!='\0';i++){pos=search_chr(s2,s1[i]); if(pos!=NULL&&search_chr(s3,s1[i])==NULL){s3[j++]=s1[i]; s3[j]='\0'; }}

例7-14

(P226)编程序实现功能:利用上面设计的字符查找函数求两个字符串中共同具有的字符并将这些字符组成第三个字符串,注意相同字符只能取一次。在第3个串中只保存一个相同字符的条件acdfga\0adshg\0s1s2s3字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.5字符串中字符的插入和删除在字符串指定位置插入字符首先在字符串中查找指定字符位置,然后将指定位置后的所有字符依次向后移动一个字符位置以空出插入字符所需的空间;最后将该字符插入到指定位置。字符的插入方式前插:插入字符在指定位置原字符之前后插:插入字符在指定位置原字符之后

7.2.5字符串中字符的插入和删除voidinsertchr(chars[],charpos,charc){ intlast=strlen(s); char*p; p=strchr(s,pos); if(p!=NULL) {for(;&s[last]>=p;last--) s[last+1]=s[last]; *p=c; } else

{s[last+1]=s[last]; s[last]=c;}}Thsis\0s‘s’‘i’p6&s[6]sis\0i存放字符串的数组插入位置处的字符插入的字符找不到插入点,则将字符插入到字符串的末尾。P229例7-17s[6]s[7]s[2]s[3]在字符串中删除指定的字符

基本思想:首先在字符串中查找指定字符的位置,若找到则将字符串中自该位置以后所有字符依次向前移动一个字符位置即可。

例7-18

请编制函数,并用相应主函数测试函数原型:

voiddeletechr(chars[],charc);

其功能是在字符串中删除指定字符,若指定字符不存在则显示相应提示信息。7.2.5字符串中字符的插入和删除使用标准函数在串中删去某个字符的方法:将被删除字符后的字符串拷贝到该字符位置。voiddeletechr(chars[],charc){ char*p; p=strchr(s,c); if(p!=NULL) strcpy(p,p+1); else printf("'%c'不在'%s'中.\n",c,s);}7.2.5字符串中字符的插入和删除sabcdef\0‘C’pp+1

def\0

字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.6字符串的比较和子串的查找标准字符串比较函数strcmp函数原型intstrcmp(constchar*string1,constchar*string2);函数调用:strcmp(s1,s2);

函数功能:按ASCII码值的大小对两个字符串从左到右逐个字符依次比较,直到出现不同字符或遇到字符结束符’\0’为止。比较结果的判断规则如下:

例7-19

编制字符串比较函数strcompare,并用主函数测试。7.2.6字符串的比较和子串的查找字符数组方式实现两个字符串比较intstrcompare(chars[],chart[]){ inti; for(i=0;s[i]==t[i];i++) if(s[i]=='\0') return0; returns[i]-t[i];}abcd\0sabkd\0t-899107比较字符串前n个字符的标准函数strncmp

函数原型:intstrncmp(char*string1,char*string2,size_tcount);

函数调用:strncmp(str1,str2,n)

函数功能:比较str1和str2两个字符串的前n个字符是否相等,如果相等则返回0,否则返回非0。7.2.6字符串的比较和子串的查找

例7-22

使用标准strncmp函数比较两个字符串前n个字符字符串中子串的查找子串:指字符串从某一位置开始连续的若干个字符构成的一个字符序列。主串:包含子串的字符串。基本思想一:①首先在主串中查找子串的首字符;②如果找到则比较主串中其后连续的若干字符是否与子串相同;③如果相同则返回子串首字符在主串中出现的位置(序号或地址);否则继续查找,直到主串中查找不到子串的首字符为止;④当被查找子串在主串中不存在,则函数返回-1或者NULL。7.2.6字符串的比较和子串的查找例7-23b

编制字符串中查找子串函数并用主函数测试7.2.6字符串的比较和子串的查找intfindsubstr(chars[],chart[]) { intsearch_chr(chars[],charc); inti=0,len=strlen(t); while((i=search_chr(&s[i],t[0]))!=-1) {if(strncmp(&s[i],t,len)==0) returni; else i++; } return-1;}求子串长度从首字符开始比较主串中有无子串,有则返回子串首字符在主串中的序号,否则继续查找。在主串中查找子串首字符,返回下标序号主串中无子串返-1abcdef\0scde\0t3i=2len=3字符串中子串的查找

基本思想二:即从主串中的第一个字符开始,以后依次向后移动一个字符的位置,取出主串中与子串长度相等的前几个字符与子串比较。若相等则返回子串在主串中的起始位置,否则继续,直到主串查找完毕为止。若主串中不存在子串,返回-1。

intfindsubstr(chars[],chart[]){ inti=0,len=strlen(t); while(strncmp(&s[i],t,len)!=0&&s[i]!='\0') i++; returns[i]!='\0'?i:-1;}7.2.6字符串的比较和子串的查找abcdef\0scde\0t字符串的常用处理方法及标准库函数字符串中有效字符的统计字符串的复制字符串的连接字符串中字符的查找字符串中字符的插入和删除字符串的比较和子串的查找字符串中子串的插入和删除字符串与二维字符数组7.2.7字符串中子串的插入和删除字符串中子串的插入

基本思想:①首先在字符串中找到插入位置

②移动插入点之后的所有字符以腾出欲插入的子串长度的位置;

③进行插入操作。

例7-25

编制子串插入函数,用主函数测试。函数原型为:

voidinsertsubstr(chars[],chart[]);7.2.7字符串中子串的插入和删除voidinsertsubstr(chars[],chart[]){intsearch_chr(chars[],charc);inti,j,len=strlen(t);for(i=0;s[i]!='\0';i++) ;j=search_chr(s,t[0]); if(j!=-1){for(;i>=j;i--) s[i+len]=s[i];

i++;

for(j=0;t[j]!='\0';j++,i++)s[i]=t[j]; }else printf("字符'%c'不在字符串'%s'中.\n",t[0],s);}sabcdefg\0

c123\0

tcdefg\0

4j=2i=7

c123

i=2尾插入点找主串的尾部,使得i=7i=strlen(s);7.2.7字符串中子串的插入和删除voidinsertsubstr(char*s,char*t){char*p1;p1=strchr(s,*t);if(p1!=NULL) { strcat(t,p1);

strcpy(p1,t); }else printf("字符'%c'不在字符串'%s'中.",t[0],s);}

例7-26

改写例7.25程序,充分利用标准函数编程实现子串插入函数insertsubstr。sabcdefg\0

c123\0

tp1cdefg\0

c123

cdefg\07.2.7字符串中子串的插入和删除字符串中子串的删除

基本思想:首先在主串中找到欲删除子串的首字符位置,然后向前移动被删除子串之后的所有字符。

例7-27

函数原型为:

voiddelsubstr(chars[],chart[]);

其功能是在一个主串中查找子串,找到则将子串从主串中删除;若子串不存在则给出提示信息。

7.2.7字符串中子串的插入和删除voiddelsubstr(chars[],chart[]){ intfindsubstr(chars[],chart[]); intpos,len; pos=findsubstr(s,t); if(pos!=-1) {len=strlen(t); for(;(s[pos]=s[pos+len])!='\0';pos++); } else printf("串'%s'不在串'%s'中.\n",t,s);}sabcdefg\0

cde\0

t取子串t的长度将s串中被删子串后的所有字符向前移动t串的长度距离。322POS5POS+32+3Len主串中查找子串

fg\0

7.2.7字符串中子串的插入和删除例7-28重写例7.27程序,充分利用标准函数编程实现子串删除函数。voiddelsubstr(chars[],chart[]){ intfindsubstr(chars[],ch

温馨提示

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

评论

0/150

提交评论