版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验八 字符数组8.1实验要求与目的1. 掌握字符数组的定义、赋值和输入输出的方法;2. 掌握字符串输入输出格式控制符%s的使用;3. 掌握字符数组和字符串处理函数的使用;4. 掌握相关的算法(字符的统计、字符的简单加密、回文字符的判定、字符的逆序存放,字符串的删除、排序等)。8.2实验指导字符串常量是由一对双引号括起来的字符序列。字符串中可包含字母,数字以及任意符号。如,“CHINA”,“#12”,“1”等都是合法的字符串常量。在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,而字符串总是以'0'作为串的结束符。即,字符串的存储是从首字符开始依次存储在一片连续
2、的存储单元,所占内存大小为字符串实际长度加字符串结束标志'0' (ASCII码值为0)。字符串的值是其第一个字符的地址。即对字符串操作两个关键问题,一是字符串的首地址,另一是字符串的结束标志'0'。字符数组的定义和引用方式与数组是相同的。特别注意的是字符数组的每个数组元素只能存储一个字符。【8.1】编程实现,用字符串“Cprogram”初始化数组ch,输入字符串“Happy”,存入字符数组str中,并输出这两个字符串。程序文件名ex8_1.c。分析:通常情况下,对一个字符串的操作,采用一维字符数组,数组长度至少为字符串的实际长度加字符串的结束标志;对多个(两个或
3、两个以上)字符串操作,采用二维字符数组,二维字符数组的第1个下标为字符串的个数,第2个下标至少为多个字符串中最长字符串的实际长度加字符串的结束标志。字符数组初始化:char ch9='C','p','r','o','g','r','a,'m','0'或, char ch9="Cprogram"或, char ch="Cprogram"字符数组的输入和输出与普通数组一样,可用循环语句逐个地输入输出每个字符,如若有定义cha
4、r str6;输入: 输出: for(i=0; i<6; i+) for(i=0; i<6; i+) scanf("%c", &stri); printf("%c",stri);字符串的输入输出通常采用格式控制符%s来实现,如,scanf("%s",str); /*str是数组名,不要加&地址符*/printf("%s",str); /*str是数组名,不能写成数组元素*/此外,用%s输入字符串遇到空格结束,因此对于含有空格字符的字符串字符可用函数gets()实现字符串的输入,如,get
5、s(str); 同样,也可采用函数puts()实现字符串的输出,如puts(str);。#include<stdio.h> void main() char str6,ch="Cprogram" printf("please input a string:n"); gets(str); /*字符串输入*/ printf("%sn%s",ch,str); /*字符串输出*/ 输入测试数据:Happy程序运行结果:CprogramHappy小结:1. 字符串输出若采用函数puts时,该函数一次只能输出一个字符串,若要输出多个字
6、符串,就必须用多条puts函数语句。如程序中用puts函数输出两个字符串,程序修改如下。#include<stdio.h> void main() char str6,ch="Cprogram" printf("please input a string:n"); gets(str); /*字符串输入*/ puts(ch); puts(str); /*字符串输出*/ 2. 用puts函数输出时,将字符串结束标志'0'转换成'n',即输出字符串后换行。【8.2】编程实现,将一个字符串按逆序存放。程序文件名:ex8
7、_2.c。分析:将任意一个字符串存入字符数组str中,一个字符串按逆序存放的算法是,只需将第一个字符和最后一个字符交换,第二个字符和倒数第二个字符交换如此循环交换即可实现逆序。本程序编程的要点:1如何确定字符串的长度?字符数组可以定义的长一点,而输入字符串的长度只需小于字符数组的长度即可。2. 最后一个字符的下标如何确定?可借助求字符串长度函数strlen;或采用循环语句求字符串的长度。 #include<stdio.h> #include<string.h> /*用到字符串处理函数须添加string.h头文件*/ void main() char str80,t; i
8、nt i,j; printf("please input a string:n"); gets(str); /*字符串输入*/ j=strlen(str)-1; /*求字符串最后一个字符的下标*/ for(i=0; i<j; i+, j-) /*借助循环实现逆序存放*/ t=strj; strj=stri; stri=t; printf("the inversed string is:n"); puts(str); /*字符串输出*/ 输入测试数据:hello c程序运行结果:c olleh小结:1. 在使用字符串函数时,需在本程序包含头文件“st
9、ring.h”。程序用到了字符串求长度函数strlen,须在main函数外部加宏定义#include<string.h>。strlen函数是求串的实际长度,不包括'0'。2. 因为数组下标是从0开始,所以最后一个字符的下标应为strlen(str)-1。3. 本题设置了两个下标变量i和j;其中,i指向第0个字符,j指向最后一个字符。通过i+和j的移动,分别实现字符的交换,当i=j时,说明i和j指向同一个字符,交换结束。4. 本题还可以只借助一个下标变量来实现逆序,程序文件名为 ex8_21.c,修改程序如下, #include<stdio.h> #inc
10、lude<string.h> void main() char str80,t; int i; gets(str); for(i=0;i<(strlen(str)/2; i+ ) t=stri; /*第i个字符与第 strlen(str)-i-1个字符互换*/ stri=strstrlen(str)-i-1; strstrlen(str)-i-1=t; puts(str); 5. 最后一个字符的下标也可采用循环语句求字符串的长度的算法来实现,修改上述程序。 #include<stdio.h> void main() char str80,t; int i,n=0;
11、 gets(str); while(strn!='0') /*计算字符串的实际长度*/ n+; for(i=0;i<n/2; i+ ) t=stri; stri=strn-i-1; strn-i-1=t; puts(str); 【8.3】编程实现,有一篇文章,共有3行文字,每行最多有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。程序文件名:ex8_3.c。分析:本程序首要问题是如何存储3行文字?可以将3行文字,看成3个字符串,而每个字符串的最大长度不超过80,故应定义一个二维字符数组text380来处理。语言可以把一个二维数组当成多个
12、一维数组处理,因此二维字符数组text380可看成是由text0、text1、text2为数组名的一维数组,则texti表示第i行的起始地址,即是第i个字符串的首地址,而textij则表示第i个字符串的第j个字符。因此统计一篇文章的各类字符的个数,可按每行统计,先判断该字符是属于哪类字符,然后分别计数即可。#include <stdio.h>void main( ) int i,j,upp,low,dig,spa,oth; char text380; /*定义二维字符数组来实现*/ upp=low=dig=spa=oth=0; printf("please input 3
13、 strings:n"); for(i=0;i<3;i+) /*输入每行不超过80个字符的3行文字*/ gets(texti); for(i=0;i<3;i+) /*外层循环表示有三行字符串*/ for(j=0;j<80&&textij!='0'j+) /*内层循环具体判断每一行字符串*/ if(texti>='A'&& texti<='Z') /*统计大写字母个数*/ upp+; else if(texti>='a'&& texti&l
14、t;='z') /*统计小写字母个数*/ low+; else if(texti>='0'&& texti<='9') /*统计数字字符个数*/ dig+; else if(texti=' ') /*统计空格字符个数*/ spa+; else oth+; /*统计其它字符个数*/ printf("upper case:%dn",upp); printf("lower case:%dn",low); printf("digit:%dn",dig)
15、; printf("space:%dn",spa); printf("other:%dn",oth);输入测试数据:E-Business!ebXML Standard & Patter!20160414 C program.程序运行结果:upper case: 8 lower case: 28 digit: 8 space: 5 other: 5小结:1 由于输入的字符串中含有空格,因此不能用格式输入函数scanf,可以用gets函数。因输入3个字符串,常采用循环语句实现。如, for(i=0;i<3;i+) gets(texti);同样,
16、若要输出多个字符串时,也采用循环语句实现。如,for(i=0;i<3;i+) puts(texti);或,for(i=0;i<3;i+) printf("%sn",texti);2. 内循环循环条件表达式 j<80&&textij!='0' ,其含义是字符数组的长度为80,所以超过字符串长度不再判断,若字符串的长度在80以内,则判断字符串是否结束可以通过判断texti是否为'0'来实现。3统计英文大写字母、小写字母等的个数时,只需判断该字符是否在A到Z或a到z等的范围内即可,而不需写相应的ASCII码值。【8
17、.4】编程实现,输入五个任意字符串,求最大字符串。程序文件名:ex8_4.c。分析:由题意,可采用二维字符数组来存储5个字符串,字符串的最大长度在没有说明时,也可定义为79个字符或自行设定。求最大字符串的算法,与求多数的最大值的算法相同。引用一个一维数组存放最大字符串,算法的核心是比较,赋值。1. 两个字符串比较大小,一定不能用关系运算符直接进行比较,而需使用字符串比较函数strcmp。字符串比较函数strcmp的一般格式:strcmp(字符数组1,字符数组2)该函数返回的结果决定了两个字符串的大小关系。字符串比较的规则:按两个字符串自左至右逐个字符以该字符的ASCII码值的大小进行比较,若全
18、部字符相同,则两个字符串相等,若出现第一对不同的字符或遇到0终止,且以这一对字符的ASCII代码值的大小决定这两个字符串的大小。因此字符串比较函数返回的值有三类,正整数、零和负整数。若返回值为正整数,则,strcmp(字符串1,字符串2)>0,其结果是字符串1大于字符串2;若返回值为零,则,strcmp(字符串1,字符串2)=0,其结果是两个字符串相等;若返回值为负整数,则,strcmp(字符串1,字符串2)<0,其结果是字符串1小于字符串2;2.字符串赋值,不能通过赋值运算符“=”实现,而需使用字符串赋值(拷贝)函数strcpy。字符串赋值函数strcpy的一般格式:strcpy
19、 (字符数组1,字符数组2)把字符数组2中的字符串,连同串结束标志0一起赋值到字符数组1中。该函数返回字符数组1的首地址。字符数组名2,也可以是一个字符串常量,这时相当于把一个字符串赋给另一字符数组。#include <stdio.h>#include <string.h>#define N 5void main ( ) char strN79,max79; int j; for(j=0;j<N;j+) gets(strj); strcpy(max,str0); for(j=1;j<N;j+) if(strcmp(max,strj)<0) /* 两个字
20、符串比较*/ strcpy(max,strj); /* 将较大的字符串存于一维数组max*/ printf("最大的字符串: %sn",max);输入测试数据:suzhouwuxizhengjiangyangzhouchangzhou程序运行结果:最大的字符串: zhengjiang 小结: 1. 在使用字符串函数时,需在本程序包含头文件“string.h”。常用的字符串函数有:字符拷贝函数strcpy、字符串连接函数strcat、字符串比较函数strcmp和字符串求长度函数strlen等。2.字符串输入函数gets和字符串输出函数puts,在使用时,需在本程序包含头文件“
21、stdio.h”。8.3实验内容8.3.1 夯实基础【8.5】编程实现,有一电文,已按下列规律译成密码: AZ, azBY ,byCX ,cx即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。编写一个程序将密码译成原文,并输出密码和原文。程序文件名:ex8_5.c。输入测试数据:sdf56wvDRE程序运行结果:cipher text is: sdf56wvDRE plain text is: hwu56deWIV【参考源程序】:#include<stdio.h>void main()int i;char ch60,tp60;gets(ch);p
22、rintf("n cipher text is :" );puts(ch);i=0;while(chi!='0')if(chi>='A')&&(chi<='Z')tpi= 'A'+'Z'-chi;else if(chi>='a')&&(chi<='z')tpi= 'a'+'z'-chi;elsetpi=chi;i+;tpi='0'printf(" pl
23、ain text is :");puts(tp); 小结:1 引用两个一维数组,一个存储原码(字符数组ch),另一个存放密码(字符数组tp)。2 采用循环语句实现原码中逐个字符译码,直到原码字符串结束标志为止。3 当循环退出时存放密码的字符数组tp,需在最后一个字符的后面添加的'0'。【8.6】编程实现,将字符串ss中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。 程序文件名:ex8_6.c。输入测试数据:abc4EFg程序运行结果:aBc4EFg【参考源程序】:#include <stdio.h> #include <str
24、ing.h>void main( ) char ss80 ; int i ; printf( "nPlease enter an string within 80 characters:n" ); gets( ss ); for(i = 1 ; i < strlen( ss) ; i+=2) if(ssi >= 'a' && ssi <= 'z') ssi -= 32 ; printf( "nAfter changing, the string:%s", ss); 小结: 由于要统计
25、下标为奇数位置的字母,循环初值为1开始,每次增2【8.7】编程实现,输入五个字符串,要求按由小到大顺序排列输出。程序文件名:ex8_7.c。输入测试数据:programwelcomemeetchinesspatter程序运行结果:chinessmeetpatterprogramwelcome【参考源程序】:#include <stdio.h>#include<string.h>void main() char st20,cs520; int i,j,p; printf("input 5 string :n"); for(i=0;i<5;i+)
26、gets(csi); printf("n"); for(i=0;i<4;i+) for(j=0;j<4-i;j+) if(strcmp(csj, csj+1)>0) strcpy(st,csj); strcpy(csj,csj+1); strcpy(csj+1,st); for(i=0;i<5;i+) puts(csi); printf("n");小结:五个字符串同样由一个二维字符数组来处理。同样将一个二维数组当成多个一维数组处理。 每个一维数组就是一个字符串,由于需要从小到大排列而不仅是求最大串,所以要采用相应排序算法。【8.8
27、】编程实现,先将字符串s中的字符按逆序存放到t串中,然后把s中的字符按正序连接到t串的后面(不能采用字符串处理函数)。程序文件名:ex8_8.c。输入测试数据:ABCDE程序运行结果:EDCBAABCDE【参考源程序】:#include <stdio.h>#include <string.h>#define N 40 void main() char sN, t2*N; int n, i; printf("n请输入长度<%d的字符串:n",N); gets(s); n = strlen(s); for (i=0; i<n;i+) /*将原
28、字符串逆序存入数组t中*/ ti = sn-i-1; for (i=0; i<n;i+) /*将原字符串连接到数组t后*/ tn+i = si; tn*2 = '0' /*为新生成的字符串末尾加'0'*/ printf("The result is: %sn", t);小结: 不用字符串连接函数strcat()也可以实现两个串的连接,借助循环依次将s串中的字符接入t串,最后要为新生成的串末尾加上'0'。【8.9】程序填空:从键盘输入由5个字符组成的单词,判断此单词是不是hello,并显示结果。请填空。填空时不得增行或删行
29、,也不得更改程序的结构,一条横线上只能填写一条语句!程序文件名:ex8_9.c。第一次运行程序输入测试数据:hello程序运行结果:this word is hello第二次运行程序输入测试数据:helop程序运行结果:this word is not hello#include<stdio.h>void main() char str ='h','e','l','l','o' char str15; 【1】 ; for(i=0;i<5;i+) 【2】 ; /*对字符数组 str1 输入*/ fl
30、ag=0; for(i=0;i<5;i+)if ( 【3】 ) flag=1; break;if ( 【4】) printf("this word is not hello"); /*通过flag来判断单词是否相同*/ else printf("this word is hello");参考答案:【1】 int i,flag【2】 str1i=getchar( )【3】 str1i!=stri【4】 flag 或flag!=1或flag=0 【8.10】程序填空:以下程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。填
31、空时不得增行或删行,也不得更改程序的结构,一条横线上只能填写一条语句!程序文件名:ex8_10.c。程序运行结果:alancuegg#include <stdio.h>#include <string.h>void main() char a="clanguage",t; int i, j, k; k= 【1】 ; for(i=0; i<=k-2; i+=2) /*将偶数下标元素排列,增量为2*/ for(j=i+2; j<=k; 【2】 ) if( 【3】 ) t=ai; ai=aj; aj=t; puts(a);参考答案:【1】 st
32、rlen(a)【2】 j+=2【3】 ai>aj小结: 本题是将字符数组a中下标值为偶数的元素排序,在排序算法中只需将循环增量改为每次增2。【8.11】程序填空:程序的功能是计算一个字符串中子串出现的次数。请填空。填空时不得增行或删行,也不得更改程序的结构,一条横线上只能填写一条语句!程序文件名:ex8_11.c。输入测试数据:abccabccab ab程序运行结果:chuxian cishu=3 #include<stdio.h>void main() int i ,j, k,count; char s20,t20; printf("zhu chuan:"
33、;); gets(s); printf("zi chuan:"); gets(t);【1】; for(i=0;si;i+) /*外层循环遍历s串*/ for(j=i,k=0; 【2】 &&sj=tk;j+,k+) /*内层循环判断s中是否有 与t相同的子串*/ if ( 【3】 ) /*如果tk+1='0'说明找到了一个子串*/ count+; printf("chuxian cishu=%dn",count); 参考答案:【1】 count=0【2】 tk或tk!='0'【3】 !tk+1 或tk+1=&
34、#39;0'小结: t和s 是给定的两个串,在主串s 中找到等于子串t的过程称为模式匹配,如果在s 中找到等于t的子串,则称匹配成功。算法思想如下:首先将s0与t0进行比较,若不同,就将s1与t0进行比较,直到s的某一个字符si和t0相同;再将它们之后的字符进行比较,若也相同,则如此继续往下比较。当s的某一个字符si与t的字符tj不同时,则s返回到本趟开始字符的下一个字符,即sij+1,t返回到t0,继续开始下一趟的比较。如此往复进行上述过程,若t中的字符全部比较完,则说明本趟匹配成功;否则,匹配失败。【8.12】程序改错:下列程序的功能是,判断一个字符串是否为回文字符串。所谓回文字符
35、串是指一个字符串正读和倒读都是同一个字符串,如,level就是回文字符串。程序文件名为ex8_12.c。根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。题中用“/*found*/”来提示在下一行有错。改错时,可以修改语句中的一部分内容,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。第一次运行程序输入测试数据: asdfg程序运行结果: asdfg bushi hui wen chuan第二次运行程序输入测试数据:abccba程序运行结果:abccba shi hui wen chuan【含有错误的源程序】:#include <stdio.h&g
36、t;#include<string.h>void main() char a79; int p=1,left,right; printf("please input a string:n");/*found*/ gets(a79); /gets(a); left=0; /*found*/ right=strlen(a); /right=strlen(a)-1; while(left<=right) /*found*/ if(aleft!=aright); /if(aleft+!=aright-); p=0; if(p) printf("%s sh
37、i hui wen chuann",a); else printf("%s bushi hui wen chuann",a);小结:回文的判断与字符串的逆序类似,本题设置了两个下标变量left和right;其中,left指向第0个字符,right指向最后一个字符。通过left+和right的移动来判断字符是否相等。 【8.13】程序改错:下列程序的功能是,将字符串s中ASCII值为偶数的字符删除,原串中剩余字符形成一个新串放在字符串t中。程序文件名:ex8_13.c。 输入测试数据:dfgthikj程序运行结果:gik根据题目要求及程序中语句之间的逻辑关系对程序中
38、的错误进行修改。题中用“/*found*/”来提示在下一行有错。改错时,可以修改语句中的一部分内容,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。【含有错误的源程序】:#include <stdio.h>#include<string.h>void main() /*found*/int i,j ; /int i,j=0 ; char s79,t79; gets(s); for(i=0;si!='0'i+) /*found*/ if(si%2=0) / if(si%2!=0) /*found*/si =tj; /tj=si;
39、 j+; tj='0' puts(t);8.3.2 应用提高【8.14】编程实现,将字符串中所有数字字符移动到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序不变。程序文件名:ex8_14.c。测试数据:def35adh3kjsdf7程序运行结果:defadhkjsdf3537【参考源程序】:#include <stdio.h>void main() int i, j=0, k=0; char s80=" def35adh3kjsdf7",t180, t280; printf("nThe original string
40、is : %sn",s); for(i=0; si!='0' i+) if(si>='0' && si<='9') t2j+=si; /*将数字字符放入t2串中*/ else t1k+=si; /*将其它字符放入t1串中*/ t2j='/0' t1k='/0' for(i=0; i<k; i+) si=t1i; for(i=0; i<j; i+) sk+i=t2i; printf("nThe result is : %sn",s);【8.15】程
41、序改错:下列程序的功能是,统计给定字符串中单词的个数。程序文件名:ex8_7.c。输入测试数据: This is a C language program.程序运行结果: There are 6 words in this text.根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。改错时,可以修改语句中的一部分内容,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。【含有错误的源程序】:#include <stdio.h>void main() char str81; int n, i, flag=0; /int n=0, i, flag=0
42、; print("n Enter a line text:n"); /printf("n Enter a line text:n"); gets(str);i=0; while(stri!='0') if(stri=' '&&flag=0) / if(stri!=' '&&flag=0) n+ ; flag=1; if (stri!=' ') flag= 0 ; / if (stri=' ') i+ ; printf("nThere are %d words in this text.n",n);小结: 统计单词个数,我们可以从判断当前字符是否为空格开始,如果是空格,则说明未出现新字符,此时flag为0;如果不是空格,我们就要判断前一个字符是否为空格,如果是空格,则说明开始出现新单
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 共青科技职业学院《运输系统规划与设计》2023-2024学年第一学期期末试卷
- 《财经公务文书》课件
- 粮食安全课件
- 甘肃中医药大学《操作系统应用》2023-2024学年第一学期期末试卷
- 人事专员培训课件
- 七年级道德与法治上册第一单元成长的节拍第三课发现自己第一课时误区警示新人教版
- 三年级数学下册一两位数乘两位数第5课时用两步连乘计算解决实际问题教案苏教版
- 三年级科学下册第三单元固体和液体5使沉在水里的物体浮起来教案苏教版
- 九年级化学上册第六单元碳和碳的氧化物课题1金刚石石墨和C60第2课时单质碳的化学性质导学案新版新人教版
- 小学生请假制度
- 2025年国务院发展研究中心信息中心招聘2人高频重点提升(共500题)附带答案详解
- 【MOOC期末】《形势与政策》(北京科技大学)期末慕课答案
- 2023年全国职业院校技能大赛赛项-ZZ019 智能财税基本技能赛题 - 模块三
- 冠心病中西医诊疗课件
- 管理ABC-干嘉伟(美团网COO)
- 七年级英语下册任务型阅读单元测试题(含答案)(word)
- 解析电力施工项目的信息化管理
- 火炬介绍 音速火炬等
- 制剂申请书(共16页)
- 对县委常委班子及成员批评意见范文
- 城市轨道交通财政补贴机制研究——基于成本规制视角[精选]
评论
0/150
提交评论