360 likes | 528 Vues
第八章 字符数据处理. 第八章 字符数据处理. 第一节 字符与字符串 第二节 字符数组 第三节 字符串处理函数 第四节 二维字符数组 第五节 应用实例. §8–1 字符与字符串. 一、 C 中的字符数据. ‘ a’,’A’ ‘<br>’,‘t’. 字符 常量 字符 变量 字符 串常量. char c;. 字符数据. “ Turbo C”. 二、字符数据的输入和输出. char c,d; scanf(“%c”,&c); d=getchar();. char c=‘a’,d=‘b’; printf(“%c”,c);
E N D
第八章 字符数据处理
第八章 字符数据处理 第一节 字符与字符串 第二节 字符数组 第三节 字符串处理函数 第四节 二维字符数组 第五节 应用实例
§8–1 字符与字符串 一、C中的字符数据 ‘a’,’A’ ‘\n’,‘\t’ 字符常量 字符变量 字符串常量 char c; 字符数据 “Turbo C” 二、字符数据的输入和输出 char c,d; scanf(“%c”,&c); d=getchar(); char c=‘a’,d=‘b’; printf(“%c”,c); putchar(d);
§8–2 字符数组 一、 数组中的各个元素均为字符变量 字符串 二 、每个元素只能存放一个字符 例:char c[20]={‘a’,’b’,’c’,…..}; c[0]=‘a’,c[1]=‘b’,….最后一个元素:c[19] 其中字符的个数不得多于20 用字符数组可以存放长度不同的字符串 串:用双引号”“括起来的字符或转义符序列 串长:字符串中所包含的字符数 串结束标记:C中的串以’\0’结束。 ’\0’称为串结束标记。
§8–2 字符数组 字符串在数组中的存储格式 字符串在字符数组中一个字符占用一个字节。字符串实际占有的存储单元数量等于字符串长度+1。 要定义一个存放字符串"CHINA"的字符数组c,应定义为:char c[6]; ‘\0’是在字符串存入字符数组时由系统自动填加的,并不是字符串本身的一部分,在计算串长的时候不包括’\0’ 。 数组c在内存中 实际存放情况 • ┏━━┳━━┳━━┳━━┳━━┳━━┓ • ┃ C ┃ H ┃ I ┃ N ┃ A ┃ \0 ┃ 串长=5 • ┗━━┻━━┻━━┻━━┻━━┻━━┛ • c[0] c[1] c[2] c[3] c[4] c[5]
§8–2 字符数组 三 、字符数组的初始化 1 。为每一个元素赋初值 char c[6]={‘a’,’b’,’c’,’d’,’e’,’f’}; 2 .C中可以使用字符串常量为字符数组初始化, char ch[6]={"CHINA"}; char ch[6]=“CHINA”; /* 省略 { } */ char ch[] ="CHINA"; /* 省略说明中字符串长度值 */
§8–2 字符数组 四、关于字符数组的几点说明: 1 字符串在内存中,系统自动加上‘\0’,作为字符串结束标记,字符串所占字节数为串中字符个数+1 char c[6]=“abcde”; 该串共占6个字节 2 程序中系统根据‘\0’来判断字符串是否结束,而不是通过数组长度。 char c[6]=“ab”;
§8–2 字符数组 3 可以 用字符串常量为数组初始化 这四种初始化是否等价? 判断: (1) char c[10]={“abcde”}; (2) char c[10]={‘a’,’b’,’c’,’d’,’e’}; (3) char c[10]=“abcde”; (4) char c[10]={‘a’,’b’,’c’,’d’,’e’,’\0’}; 结论 (1)=(3)=(4) C语言并不要求所有的字符数组的最后一个元素必须是‘\0’(如果使用串,系统自动加上)
§8–2 字符数组 五 、字符数组的输入输出 int a[10],i; for(i=0,i<10;i++) { scanf(“%d”,&a[i]); printf(“%d,”,a[i]);} 基本数据类型中所有的数组都可以通过循环语句,逐一赋值 字符数组除采用此方法之外,还有其他方式 输入 是否循环? 是否自动换行? 是否用数组名? 是否用取址符? 字符串 %s 输出 只能是字符型
§8–2 字符数组 1 字符数组的输入 介绍三种方法: (1)用scanf函数 ,用循环结构,逐一输入元素的值,元素前用取址符&,格式为%c char c[10];int i; for(i=0;i<10;i++) scanf(“%c”,&c[i]); (2) 用scanf函数,整串输入,不用取址符,只写数组名,格式为%s 数组名 char c[10]; scanf(“%s”, c ); 任何数组的数组名代表了数组在存储空间中的起始地址 注意:遇回车,空格输入结束
§8–2 字符数组 (3) 用gets( )函数,一次输入一个整串, 遇回车结束 char str[10]; gets( str ); 任何数组的数组名代表了数组在存储空间中的起始地址 数组名 scanf, %c 循环 &c[i] scanf, %s 数组名 空格,回车结束 gets( )数组名,回车结束 总结:
§8–2 字符数组 2 字符数组的输出 介绍三种方法: char c[10];int i; (假定已有值) …... for(i=0;i<10;i++) printf(“%c”,c[i]); (1)用printf 函数,循环结构,逐一元素输出,格式为%c (2) 用printf函数,格式为%s ,用数组名,整串输出 char c[10]=“abcdef”; printf(“%s\n”,c); 不自动换行 (3)用puts( )函数,一次输出整串 char str[10]=“abcde”; puts( str ); 自动换行 数组名
§8–2 字符数组 说明: *字符数组可以按字符串输出,输出时,遇‘\0’结束 *字符数组中,若有多个‘\0’, 遇到第一个‘\0’,输出结束 Char str[10]={‘a’,’b’,’e’,’\0’,’s’,’r’,’\0’}; puts(str); abe printf, %c 循环 c[i] printf, %s 数组名 不自动换行 puts( )数组名 自动换行 总结:
main() { int i;char str[13]; printf(“1:scanf & printf %%c:\n”); for (i=0;i<13;i++) scanf(“%c”,&stri]); for (i=0;i<13;i++) printf(“%c”,str[i ]); printf(“\n”); printf(“2:scanf & printf %%s:\n”); scanf(“%s”,str); printf(“%s”,str);printf(“\n”); printf(“3:gets & puts :\n”); gets(str); puts(str); } §6–3 字符数组(续) 三次输入: computer & C 整串输入输出
§8–3 字符串处理函数 #include<string.h> C的库函数中提供了有关字符串输入,输出,字符串复制,字符串连接,字符串比较,求字符串长度,字母大小写转换等函数 所有的函数在使用时,程序开始加文件包含: #include<string.h> 字符数组名 1 字符数组输出 格式:puts(字符数组) 功能:从终端输出指定字符数组 char str[ ]=“Turbo C”; puts(str); 自动换行
§8–3 字符串处理函数 char str[80]; gets(str); puts(str); 2 字符数组输入 格式:gets(字符数组) 功能:从输入设备上输入一个字符串, 遇回车结束 可以是字符数组, 也可以字符串常量 3 字符串连接 格式:strcat(字符数组1,字符数组2) 功能:将字符数组2连接到字符数组1的后面 char c1[10]=“abc”; strcat(c1,”efg”);puts(c1); abcefg
§8–3 字符串处理函数 要求 * 字符数组1长度必须能够容纳两个串的长度 * 连接时自动取消数组1后面的‘\0’ 下面程序的运行结果是 #include<string.h> main() { char a[80]=“AB”, b[80]=“LMNP”; int i=0; strcat(a,b); while (a[i++]!=‘\0’) b[i]=a[i]; puts(b); } A) LB B) ABLMNP C) AB D) LBLMNP
a b c d e \0 L M N \0 L M N \0 §8–3 字符串处理函数 4 字符串拷贝 格式:strcpy(字符数组1,字符数组2) 功能:将字符数组2复制给字符数组1 c1 c1 char c1[20]=“abcde”,c2=“LMN”; strcpy(c1,c2); 或: strcpy(c1,”LMN”); puts(c1); 显示LMN c2
§8–3 字符串处理函数 说 明 (1)字符串不能彼此赋值 ,只能用拷贝函数 (2)字符数组1定义的长度必须比字符数组2大(或相等) (3) 字符数组2可以用字符串常量,字符数组1必须写成变量名 (4) 连同‘\0’一起复制 (5) 可以复制部分字符,即 char c1[20],c2[ ]=“Trubo C”; strcpy(c1,c2,4);只复制前4个字符 (6) 如果原数组1中有字符,则复制后将原有内容覆盖(没覆盖的部分保留,但不显示)
§8–3 字符串处理函数 C语言中的数据赋值 1.整型数据:int a,b=5; a=b; 2.实型数据: float x,y=0.5; x=y; 3.字符型数据:char c1,c2=‘A’; c1=c2; 4.字符数组:char str1[10]={“abcde”}; char str2[10]; strcpy(str2,str1); 赋值 字符串拷贝
§8–3 字符串处理函数 char a[7]=“abcdef”,b[4]=“ABC”; strcpy(a,b); printf(“%c”,a[5]); A) 空格B) \0 C) e D) f 如果数组1>数组2 函数值为正 如果数组1<数组2 函数值为负 如果数组1==数组2 函数值为0 5 字符串比较 格式:strcmp(字符数组1,字符数组2) 功能:从左到右逐一比较数组1和数组2各字符的ASCII 值,若相同,继续,若不同,返回一个整数(以第一个不相同的字符比较为准)
§8–3 字符串处理函数 C语言中的数据比较 1.整型数据:int a,b if(a==b) 2.实型数据: float x,y if(abs(x-y)<1e-5) 3.字符型数据:char c1,c2 if(c1==c2) 4.字符串:char str1[10],str2[10] if(strcmp(str1,str2)==0) 绝对值 记! 两个字符串怎样交换?
b a s i c \0 e p f p p f o n a r r o d o s r o r t g \0 c t g r r r r a a l a a a n m \0 n m \0 \0 \0 \0 开始c1[8],c2[8] 例题:从键盘输入五个字符不多于7个的字符串,输出其中最大的。 输入一个串c1 c1[8] N i<4? Y c2[8] 输出c1 输入一个串c2 N c1小? Y C1数组中存放 当前最大的串 program 字符串拷贝
开始c1[8],c2[8] 输入一个串c1 N I<4? Y 输出c1 输入一个串c2 N c1小? Y 字符串拷贝 #include<string.h> main( ) { char c1[8],c2[8]; int i; printf(”Input c1: ”); gets(c1); for (i=0;i<4;i++) { printf (”Input c2: ”); gets(c2); if ( strcmp(c1,c2)<0) strcpy(c1,c2); } printf (”The result is : ”); printf (”%s”,c1); } 运行
CAD/CAPP/CAM 设计 制造 int IT; float Ra; 工艺设计 登录(密码检查) 加工精 度IT=7 输入IT,Ra,…... 加工方法、 机床、刀具、 夹具…... 搜索加工知识库 表面粗糙 度Ra=1.6 输出加工方法、设备等
§8–3 字符串处理函数 怎样交换两个字符数组? 怎样将五个字符串排序输出? 怎样将100本英文书名做字典排序? 冒泡排序
§8–3 字符串处理函数 6 求字符数组(串)的长度 不包含字符串结束标记‘\0’ 格式:strlen(字符数组) 功能:测试字符数组中所含字符的个数 转义字符 char str[10]=“Trobu C”; printf(“%d”,strlen(str)); 结果: 7 结束 3 char str[ ]=“\t\v\\\0will\n”; printf(“%d”,strlen(str)); ?
§8–3 字符串处理函数 7 字符串字母大小写转换 单向的转换,不是对换 格式:strlwr(字符数组) 功能:将数组中的大写字母转换成小写 格式:strupr(字符数组) 功能:将数组中的小写字母转换成大写 char str=“Turbo C”; printf(“%s”,strupr(str)); printf(“%s”,strlwr(str)); TURBO C turbo c
§8–4 二维字符数组 一、二维数组中的元素均为字符型数据 二、定义: char str[3][10]; 字符串 三、初始化方式: char str[3][10]={“abc”,”efg”,”12345”}; 四、引用: f 1。printf(“%c”,str[1][1]); 2。printf(“%s”,str[1]); efg 2345 3。printf(“%s”,&str[2][1]);
§8–5 数组的应用 有一篇文章,共三行文字,每行有80个字符,要求统计出其中英文大写字母,小写字母,数字,空格,以及其他字符的个数 三行 80个字符 题目 分析 按行输入字符(用哪个函数?循环几次?) 对第 i行的每一列(每个字符)进行判断,是否为大写,小写,数字,空格或其他 (循环几次?) i 定义二维字符数组 char text[3][80] 循环嵌套,外层循环对行共3次,内层循环对列共80次,且遇‘\0’终止 对二维数组中的每一个元素text[i][j]进行判断
for( i=0;i<3;i++) 输入文章的第 i 行 N-S图: for(j=0;j<80&&text[I][j]!=‘\0’;j++) ‘A’~’Z’ T F ‘a’~’z’ F T 大写字母数加1 小写字母数加1 ‘0’~’9’ T F 数字个数加 1 ‘ ‘ F T 空格数加 1 “其他”个数加 1 输出大写字母,小写字母,数字,空格和“其他”的个数
§8–5 数组的应用 • 求字符串的长度 #include <stdio.h> main ( ) { int length=0 ; char line[100]; gets(line); while( line[length] != '\0' ) length ++; printf (“String length=%d”, length); } 根据字符串中‘\0’的位 置来计算字符串长度。
§8–5 数组的应用 将字符串str1拷贝到串str2中。 • 字符串复制。 #include <stdio.h> main ( ) { char str1[100], str2[100]; int i; printf ("Enter string 1:"); gets (str1); for (i=0; (str2[i]=str1[i])!='\0'; i++) ; printf("Output string 2:%s\n", str2); } 根据字符串中‘\0’的位 置来复制字符串。
第八章 总结 一 数组的三要素:类型,数组名,长度 二 数组的初始化方法(字符数组的特殊性) int a[ ]={ 1,2,3,4,5,6}; int a[6]={ 1,2,4}; char c[6]={ ‘a’,’b’,’c’,’d’,’e’}; char c[6]=“abcde”; char c[ ]={ “abcde”}; char c[ 6]={‘a’,’b’,’c’,’d’,’e’,’\0’}; int a[ ][3]={1,2,3,4,5,6}; int a[2][3]={ {2,3},{0,4,5}}; char str[3][10]={“aaa”,”bbb”,”ccccc”};
第八章 总结 四 数组元素的引用,下标从0开始 五 字符数组的输入和输出 * 字符数组可以整串操作 %s * 数组名代表数组元素的起始地址 * 字符串一定是以 ‘\0’结尾 六 字符串处理函数 Strcat 连接 (将某串接在一字符数组之后) strcpy 复制(字符串不允许赋值,只能将某串 复制给一个字符数组) strcmp 比较 (判断两串是否相等)常用于字符串按ASCII顺序排序的操作
第八章 总结 strlen 求字符串中有效字符的个数(含中间的空格,但不含结束标记‘\0’) 输入:char str[10] scanf %c &str[I] 循环输入 scanf %s str 接受空格,回车前的字符 gets(str) 接受回车前的字符 输出:printf %c str[I] 循环输出 printf %s str 整串,不换行 puts (str) 整串,自动换行 * 转义字符在字符串常量中 * 二维数组按行存储 注意