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