C程序设计讲义四川职业技术学院邓绯第1页共7页C程序设计讲义数组(理论三)教学目的:1.了解字符数组的基本概念2.掌握字符类型变量的定义与引用3.字符数组的定义与引用、常用字符串处理函数及字符处理函数教学重(难)点:字符数组的定义与引用、常用字符串处理函数及字符处理函数授课形式:理论教学条件:多媒体教学内容:复习:一维数组的使用,二维数组的使用新课:字符数组字符数组:存放字符型数据的数组。其中每个数组元素存放的值都是单个字符。字符数组分为一维字符数组和多维字符数组。一维字符数组常常存放一个字符串,二维字符数组常用于存放多个字符串,可以看作是一维字符串数组。1.字符数组的定义、初始化及引用字符数组也是数组,只是数组元素的类型为字符型。所以字符数组的定义、初始化,字符数组数组元素的引用与一般的数组类似。(定义时类型说明符为char,初始化使用字符常量或相应的ASCII码值,赋值使用字符型的表达式,凡是可以用字符数据的地方也可以引用字符数组的元素)。例如:charc1[10],str[5][10];charc2[3]={‘r’,’e’,’d’};或charc2[]={‘r’,’e’,’d’};printf(“%c%c%c\n”,c2[0],c2[1],c2[2]);2.字符串与字符数组(1).字符串与字符数组字符串(字符串常量):字符串是用双引号括起来的若干有效的字符序列。C语言中,字符串可以包含字母、数字、符号、转义符。字符数组:存放字符型数据的数组。它不仅用于存放字符串,也可以存放一般的、对一般读者看来毫无意义的字符序列。C语言没有提供字符串变量(存放字符串的变量),对字符串的处理常常采用字符数组实现。C语言许多字符串处理库函数既可以使用字符串,也可以使用字符数组。为了处理字符串方便,C语言规定以’\0’(ASCII码为0的字符)作为“字符串结束标C程序设计讲义四川职业技术学院邓绯第2页共7页志”。如果不是处理字符串,字符数组中可以没有字符串结束标志。例如:charstr1[]={‘C’,’H’,’I’,’N’,’A’};str1:字符数组,占用空间5个字节CHINAcharstr2[]=”CHINA”;占用空间6个字节CHINA‘\0’(2).字符数组的初始化(除了一般数组的初始化方法外,增加了一些方法)(1)以字符常量的形式对字符数组初始化。注意:这种方法,系统不会自动在最后一个字符后加’\0’。例如:charstr1[]={‘C’,’H’,’I’,’N’,’A’};或charstr1[5]={‘C’,’H’,’I’,’N’,’A’};没有结束标志。如果要加结束标志,必须明确指定。charstr1[]={‘C’,’H’,’I’,’N’,’A’,’\0’};初始化为0,相当于有字符串结束标志。(2)以字符串(常量)的形式对字符数组初始化。(系统会自动在最后一个字符后加’\0’)例如:charstr1[]={”CHINA”};或chars1[6]=”CHINA”;charstr2[80]={”CHINA”};或chars2[80]=”CHINA”;(3).字符数组的输入输出(两种形式:逐个字符输入/输出,整串输入/输出)(1)逐个字符输入/输出:采用“%c”格式说明和循环,像处理数组元素一样输入输出一个字符。说明:格式化输入是缓冲读。必须在接受到“回车”时,scanf才开始读取数据。读字符数据时,空格、回车都保存进字符数组。如果按“回车”键时,输入的字符少于scanf循环读取的字符时,scanf继续等待用户将剩下的字符输入;如果“回车”键时,输入的字符多于scanf循环读取的字符时,scanf循环只将前面的字符读入。逐个读入字符结束后,不会自动在末尾加’\0’。所以输出时,最好也使用逐个字符输出。(2)整串输入/输出:采用“%s”格式符来实现例charc[]={“china”};printf(“%s”,c);C程序设计讲义四川职业技术学院邓绯第3页共7页在内存中是意’\0’结束,因此输出时遇到’\o’就停止输出。故输出结果为china注意:输出字符不包括’\0’用’%s’格式输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名判断:printf(“%s”,c[0]);如果数组长度大于字符串的实际长度也只输出到遇’\0’结束。如果一个字符数组中包含一个以上的’\0’则遇到一个’\0’时输出就结束可以用scanf输入一个字符串,例如scanf(”%s”,c);c是数组名他应该在输入以前被定义。从键盘输入字符串时,应该注意应短于已定义的字符数组的长度注意scanf函数中输入项是字符数组名时,不要在前面加&3.字符串(字符数组)处理函数1.字符串输入,输出函数(stdio.h)(1)字符串输入gets(str);功能:从键盘终端输入一个字符串(可包含空格),直到遇到回车符,并将字符串存放到由str指定的字符数组(或内存区域)中。参数:str是存放字符串的字符数组(或内存区域)的首地址。(2)字符串输出puts(str);功能:从str指定的地址开始,依次将存储单元中的字符输出到显示器,直到遇到“字符串”结束标志。注意:puts将字符串最后的’\0’转化为’\n’并输出。2.字符串处理函数(string.h)(1)字符串长度测量函数strlen(str1)如:strlen(”china”)(2)字符串连接函数strcat(str1,str2)功能:将str2为首地址的字符串连接到str1字符串的后面,从str1原来的’\0’(字符串结束标志)处开始连接,将结果放在str1里面。(3)字符串复制函数strcpy(str1,str2)功能:将str2为首地址的字符串复制到str1为首地址的字符数组中。Charstr1[10],str[]={“china”};C程序设计讲义四川职业技术学院邓绯第4页共7页Strcpy(str1,str2);(4)字符串比较函数strcmp(str1,str2)功能:将str1,str2为首地址的两个字符串进行比较,比较的结果由返回值表示。当str1=str2,函数的返回值为:0;当str1str2,函数的返回值为:负整数;当str1str2,函数的返回值为:正整数;字符数组应用举例例:输入一行字符,统计其中有多少个单词,单词之间用空格隔开#include“stdio.h”voidmain(){charstring[81];IntI,num=0,word=0;/*num用来统计单词个数,word用来判别是否单词的标志*/charc;gets(string);for(i=0;(c=string[i])!=’\0’;i++)if(c==’‘)word=0;elseif(word==0)/*判断前面是否有空格,若有则证明有单词,num++*/{word=1;num++;}printf(“thereare%dwordsintheline\n”,num);}例:编写一个程序,将字符数组s2中的全部字符拷贝到字符数组S1中,不用strcpy函数,拷贝时,’\0’也要拷贝过去。’\0’后面的字符不拷贝。#include“stdio.h”voidmain(){charfrom[80],to[80];inti;printf(“pleaseinputstring:”);scanf(“%s”,from);C程序设计讲义四川职业技术学院邓绯第5页共7页for(i=0;i=strlen(from);i++)to(i)=from(i);printf(“aftercopystringis:%s\n”,to);}例:有一行电文,已按下面规律译成密码。A-Za-zB-Yb-yC-Xc-x………..#include“stdio.h”voidmain(){inti,n;Charch[80],tran[80];/*ch密文,tran原文*/printf(“pleaseinputcharacter:”);gets(ch);printf(“\nsecretcodeis:%s”,ch);i=0;while(ch[i]!=’\0’){if((ch[i]=’A’)&&(ch=’Z’))tran[i]=26+64-ch[i]+1+64;elseif((ch[i]=’a’)&&(cj[i]=’z’))tran[i]=26+96-ch[i]+1+96;elsetran[i]=ch[i];i++;}n=i;printf(“\noriginalcodeis:”);for(i=0;in;i++)putchar(tran[i]);}C程序设计讲义四川职业技术学院邓绯第6页共7页例:输入一个整数n和一个字府串,将字符串循环左移n个字符。#include“stdio.h”#include“string.h”voidmain(){charstr1[80],temp;inti,j,length;puts(“pleaseinputaintsgerandastring:”);scanf(“%d%s”,&n,str1);length=strlen(str1);for(i=0;in;i++){temp=str1[0];for(j=0;jlength-1;j++){str1[j]=str1[j+1];}str[j]=temp;}puts(str1);}例:由键盘任意输入一个字符串和一个字符,要求从该字符串中删除所指定的字符。程序:#includestdio.hvoidmain(){chars[20],temp[20],x;inti,j;gets(s);printf(“delete?”);scanf(“%c”,&x);for(i=0,j=0;istrlen(s);i++){if(s[i]!=x){temp[j]=s[i];j++;}多设置了一个数组C程序设计讲义四川职业技术学院邓绯第7页共7页}temp[j]=’\0’;strcpy(s,temp);puts(s);}课后总结:1.讲解了字符数组的基本概念2.讲解了字符类型变量的定义与引用3.讲解了字符数组的定义与引用、常用字符串处理函数及字符处理函数