200 likes | 348 Views
第 9 讲 字符型数组及应用. 第 9 讲 字符型数组及应用. 本讲主要内容 字符数组的定义及初始化 字符串输入输出操作 常用的字符串操作函数 字符型数组的 应用. 第 9 讲 字符型数组及应用. 教学目标 掌握字符串的输入输出方法,熟悉常用的字符串操作函数; 学会使用 字符 数组解决实际问题的基本方法 , 能用一维 字符 数组和二维 字符 数组解决简单的实际问题。. 一、字符数组的定义、初始化. 字符数组的定义
E N D
第9讲 字符型数组及应用 本讲主要内容 • 字符数组的定义及初始化 • 字符串输入输出操作 • 常用的字符串操作函数 • 字符型数组的应用
第9讲 字符型数组及应用 • 教学目标 • 掌握字符串的输入输出方法,熟悉常用的字符串操作函数; • 学会使用字符数组解决实际问题的基本方法,能用一维字符数组和二维字符数组解决简单的实际问题。
一、字符数组的定义、初始化 • 字符数组的定义 字符型数组是数据类型为字符型的数组,用于存放字符数据,每一个元素存放一个字符。字符型数组与数值型数组在本质上没有区别,但在具体使用时,还是有其自身的特点,因此对字符型一维数组的初始化进行专门的介绍。 定义格式如下: char数组名[数组长度] 例如: char array[10];
一、字符数组的定义、初始化 • 字符数组的初始化 ⑴ 对字符数组初始化时,通常使用转义字符常量'\0'作为末尾元素值。例如: char string[8]={'e','x','a','m','p','l','e','\0'}; ⑵ 可以使用一个字符串常量为字符数组赋初值。例如,上述对数组string的定义可使用如下形式: char string[8]="example"; ⑶ 初始化时,省略对数组长度的说明后,数组的实际长度由系统根据初始化的形式确定。例如: char string[]="example";
二、字符串输入输出操作 • 用“%c”格式符输入输出字符串。 例7-3 输入20个字符,分别统计其中的数字个数和其他字符的个数。
二、字符串输入输出操作 main() { char s[20]; int i,number=0,other=0; printf("Input a string: "); for(i=0;i<20;i++) scanf("%c",&s[i]); for(i=0;i<20;i++) switch(s[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': number++;break; default: other++; } printf("number: %d, other: %d\n",number,other); }
二、字符串输入输出操作 • 用“%s”格式符输入输出字符串。 例如: char c[6]; scanf("%s",c); printf("%s",c); 说明: ⑴C语言中,数组名代表该数组的起始地址,因此,scanf()函数中数组名前不再加地址运算符&。 ⑵“%s”格式输出字符串时,printf()函数的输出项是字符数组名,而不是元素名。如下用法是错误的: printf("%s",c[0]);
二、字符串输入输出操作 • 输出字符串函数puts() 格式:puts(字符数组名) 功能:输出存储在字符数组中的字符串。 例如: char c[6]="China"; puts(c); 结果:China
二、字符串输入输出操作 • 输入字符串函数gets() 格式:gets(字符数组名) 功能:从键盘输入一个字符串,并存储在指定数组中。 例如: char str[12]; gets(str); 执行gets()函数后,系统等待从键盘输入一个字符串。
三、常用的字符串操作函数 • 连接字符串函数strcat() 格式:strcat(s1,s2) 功能:把字符串s2连接到字符串s1的后面。其中,s1、s2既可以是字符数组名,也可以是字符串常量。
三、常用的字符串操作函数 例7-5 字符串连接 main() { char c1[10]="China",c2[10]= "man"; strcat(c1,c2); printf("String c1: "); puts(c1); /* 输出字符串c1 */ printf("String c2: "); puts(c2); /* 输出字符串c2 */ }
三、常用的字符串操作函数 • 复制字符串函数strcpy() 格式:strcpy(s1,s2) 功能:把字符串s2复制到字符数组s1中。 说明: s1只能是字符数组名或字符数组的开始地址;s2可以是数组名,也可以是一个字符串。
三、常用的字符串操作函数 例7-6 字符串复制 /* 程序e706.c */ #include"stdio.h" main() { char c1[20]="program",c2[10]="example"; strcpy(c1,c2); printf("String c1: "); puts(c1); printf("String c2: "); puts(c2); }
三、常用的字符串操作函数 • 字符串比较函数strcmp() 格式:strcmp(s1,s2) 功能:比较字符串s1和字符串s2的大小。s1与s2相同时,strcmp(s1,s2)的值为0;s1大于s2时,strcmp(s1,s2)的值为一个正数;s1小于s2时,strcmp(s1,s2)的值为一个负数。 字符串比较就是比较字符串中字符的ASCII码,ASCII码值大的字符串大。比较的方法是对两个字符串自左至右逐个字符比较,直到遇到不同字符或'\0'时比较过程结束,此时,ASCII码值大的字符所在的字符串大。
四、字符型数组的应用 • 例8-3 输入一行字符,统计其中单词的个数。 设长度是n的字符串已存储在字符数组text中,各字符元素分别为text[0]、text[1]、text[2]……text[n-1],当检测text[i](i>0)时,若满足下列条件,则必然出现新单词: text[i-1]==''&&text[i]!=''
四、字符型数组的应用 main() { char text[100]; int word,i; gets(text); if(text[0]==' ')word=0; else if(text[0]!='\0')word=1; i=1; while(text[i]!='\0') { if(text[i-1]==' '&&text[i]!=' ')word++; i++; } printf("word=%d\n",word);}
四、字符型数组的应用 • 例8-4 判断s2是否是s1的子串。 基本思路:从s1字符串的第一个字符开始,依次与s2字符串的各字符比较,若均相同,则s2是s1的子串;否则再从s1的下一个字符(第2个字符)开始,依次与s2字符串的各字符比较,……。设k1,k2分别表示s1串和s2串的长度,则最后一次应从s1的第k1-k2+1个字符开始(即s1[k1-k2]),依次与s2字符串的各字符比较,若存在不同字符,则s2肯定不是s1的子串。
四、字符型数组的应用 while(i<k1-k2+1&&!flag) { j=0; k=i; while(s2[j]&&s1[k]==s2[j]) { j++; k++; } if (s2[j]=='\0') {flag=1; break; } i++; } if(flag==1) printf ("%s is in %s.\n",s2,s1); else printf ("%s is not in %s.\n",s2,s1);} main( ) { char s1[80],s2[80]; int i=0, j, k, k1, k2, flag; gets(s1); gets(s2); k1=strlen(s1); k2=strlen(s2); flag=0;
字符型数组及应用-小结 本单元通过7个实例介绍了一维数组和二维数组的应用知识,使用数组解决问题的一般过程总结如下: • 定义大小合适的数组。为了方便数组长度调整和程序调试,通常将数组的长度值首先定义为符号常数,然后再用于数组定义中。 • 为数组输入数据。 • 数组元素的运算处理,如排序、查找、判断统计、元素求和等。 • 输出结果。当需要对二维数组输出时,应注意每输出一行后的换行操作,使输出的结果为行列形式。 • 字符型数组具有数组的一切性质,但又有其特点,对字符型数组的操作对应有大量的操作函数,如字符串复制、连接、比较等均有专门的函数予以实现。