1、1/30,5.3 字符数组与字符串,char a=W; char b=a; char c=n; char d=g; char e=L; char f=i;,如何让程序存储我的姓名?,Wang Li,char name15 = W, a, n, g, L, i;,用若干个字符,用字符数组,用字符串char name15= “Wang Li”;,2/30,5.3.1 一维字符数组,一维字符数组的定义、引用、初始化与其他类型的一维数组一样。 char str80;定义一个含有80个字符型元素的数组strchar t5=H, a, p, p, y; 初始化数组 t,输出数组 t 的所有元素 for(i
2、=0; i5; i+)putchar( ti );,3/30,5.3.2字符串,字符串常量是双引号括起的任意字符序列,“Hello World“ “WangPing“ “Please enter your full name:“ “Hello!n“,字符串常量中可以包含转义序列,字符串结束符,字符串的有效长度:有效字符的个数,字符串常量,3,4/30,字符串的存储,auto char s80= “Happy“; 字符串遇 0 结束 第一个 0 前面的所有字符和 0 一起构成了字符串 “Happy” 0 之后的其他数组元素与该字符串无关,字符串由有效字符和字符串结束符 0 组成,5/30,字符串
3、与字符数组,在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串 字符数组和字符串的区别是:字符串的末尾有一个空字符 0,字符串可按如下方式声明并初始化: char name15= W, a, n, g, L, i, 0; char name15 = “WangLi“; char password = “12345678“;,手工加入一个空字符,系统将自动加入一个空字符,省略数组大小,系统自动计算,大小为后面的字符总数加1,最后一个元素存入一个空字符。,6/30,2. 对字符串的操作,把字符串放入一维字符数组(存储) 对字符串的操作 = 对字符数组的操作 普通字符数组:数组元素的个
4、数是确定的,一般用下标控制循环 字符串:没有显式地给出有效字符的个数,只规定在字符串结束符 0 之前的字符都是字符串的有效字符,一般用结束符 0 来控制循环 循环条件:si != 0,7/30,5.3.3 字符串的输入输出,例11 从键盘读入一个字符串,以回车符表示输入结束。输出该字符串长度,然后输出该字符串,方法1: 象普通数组一样逐元素输入输出,输入: s0=getchar(); /读入第一个字符 i=0; while(si!=n) /当不是回车 i+;si=getchar(); si=0; /将n转换为 0,或 i = 0; while(si = getchar( ) != n) i+;
5、 si=0; /将n转换为 0,for( i=0; stri!=0; i+)putchar(stri);,字符串长度是i还是i-1、i+1?,字符串长度是有效字符个数s0si-1,共i个,输出字符串,不需要知道字符个数,0是结束标志,0,8/30,方法2:用%s整体输入输出,char name10;,scanf(“%s“, name);,printf(“%s“, name);,格式描述串中使用转换字符串“%s”,Wang Li,Wang,空格是%s输入结束的标志,9/30,方法3:用gets和puts函数,char name10; gets(name); puts(name);,Wang Li
6、,Wang Li,从键盘上读入一个完整的行,存入字符数组name。并用空字符0取代行尾的换行符n。,把字符数组中的字符串输出到显示器。,10/30,5.3.4字符串应用举例,例12. 输入一行字符(字符个数不多于80),统计其中空格的个数,思路分析: (1)定义字符数组 str81; (2)读入字符串 若字符串确定不含空格,可以用scanf(“%s”,i+) ,11/30,#include int main() char str81;int i, count = 0;printf(“n 请输入一行字符:n “);gets(str);for(i=0; stri != 0; i+)if( stri
7、 = )count+;printf(“n 其中的空格总数为 %d n “,count); ,C is a programming language,在循环执行时,扫描整个数组以统计出空格 的数量,直到遇到字符 0。,其中的空格总数为 4,也可用while 循环 i = 0; while(stri!=0) if(stri = )count+;i+; ,12/30,(1)输入一个以回车结束的字符串(少于80个字符),统计其中数字字符的个数。 (2)输入一个以回车结束的字符串(少于80个字符),统计其中0、1、2、 9,哪个数字字符的出现次数最多,模仿练习:,#include int main()
8、int count, i;char str80;printf(“Enter a string: “); gets(str);count = 0;for(i = 0; stri != 0; i+) /若是数字if(stri = 0) count+;printf(“count = %dn“, count);return 0; ,模仿练习 源程序,Enter a string: Its 512? count = 3,14/30,例13 进制转换,输入一个以回车结束的字符串(少于80个字符),把字符串中的所有数字字符(09)转换为整数,去掉其他字符。例如,字符串”3a56bc”,转换后的整数为356,
9、难点分析: 如何将字符串转化为整数值? 例如字符串”356“转换为整数356 (1)遇到第一个整数3, d=3; (2) 遇到第二个整数5, d=d*10+5=35 (3) 遇到第三个整数6, d=d*10+6=356 .,d=0; for(i=0; stri != 0; i+) if( stri =0 & str=9 )d=d*10+(stri-0),stri中存的是字符, stri-0将其转化为对应的十进制数字,15/30,#include int main() int d, i;char str80;printf(“Enter a string: “); gets(str);d = 0;
10、for(i = 0; stri != 0; i+) /若是数字if(stri = 0) d = d*10 + (stri - 0)printf(“d = %dn“, d);return 0; ,16/30,例14 统计单词个数,方法1:统计空格数?问题:没多个空格相连的情况 方法2:如果一个空格紧跟一个非空格,一定是新单词开始this is my first test!问:第一个单词是否算上?答: count再加1就行!?再问:若第一个单词前有空格会怎样?就又多了1,17/30,思路分析,方法3:如果一个非空格后是一个空格,一定是单词的结束this is my first test!问:最后一
11、个单词没算上?答: count再加1就行!?再问:若最后一个单词后有空格会怎样?就又多了1,18/30,思路分析,设置一个标志变量word 开始word置0 For(i=0;stri!=0;i+) /扫描整个字符串若stri是空格word置0若stri不是空格且word=0则新单词出现,count+; word置1;,19/30,#include int main() char str1000;int i, word, count;word=0; count=0;gets(str);for(i=0; stri!=0; i+)if(stri= ) word=0;if(stri!= ,程序实现,2
12、0/30,5.3.5 常用字符串函数,以下介绍的字符串函数定义在头文件中 (1)strlen: 求字符串长度 (2)strcpy:字符串复制(赋值) (3)strcmp:字符串比较 (4)strcat:字符串合并 (5)strrev:字符串逆置,21/30,2019/7/30,21,(1) 求字符串长度 strlen( ),调用格式:strlen(str) 功能:测试字符串长度。函数值就是str中字符的个数。,输出结果: 5,例如: char str10= “China“; printf(“%d“,strlen(str); 或 printf(“%d“,strlen(“China“);,22/3
13、0,2019/7/30,22,(2)字符串复制函数 strcpy( ),调用格式:strcpy(str1,str2) 功能:将str2中的字符串复制到str1数组中。,思考:这样赋值 s1=“Beijing“ ;或 s1=s2;可以吗?为什么?,s1的结果,例如: char s110,s2 = “Beijing“;strcpy(s1,s2); 或:strcpy(s1,“Beijing“);,23/30,字符串的赋值需要通过strcpy实现,char str110 =“China”;,正确,char str110 ;str1=“China”;,错误,改为: char str110 ;strcpy
14、(str1,“China”);,char str110 ,str2 =“China”;str1 = str2;,改为: char str110 ,str2 =“China”; strcpy(str1,str2);,为什么不允许这样赋值? 因为数组名是一个常量,代表数组的首地址,常量不可以被赋值,其值不可改变,错误,24/30,24,(3)字符串比较函数 strcmp( ),调用格式:strcmp(str1, str2),功能:比较str1和str2的大小,若前者大则返回一个正整数,若后者大则返回一个负整数,若两者相等,则返回0。 注意: 比较两个字符串的大小只能使用此函数,而不能使用“”、“”
15、、“=”等关系运算符。,字符串比较规则:按自左至右的顺序,对应字符比较,若当前对应字符不同,则返回二者ASCII码的差,若二者相同,则比较下一个字符,直到遇到不同字符为止,函数返回值为两字符的差,str1 str2 “cat” “fan” “abcde” “abd” “abcde” “abc” “abc” “abc”,=,strcmp(str1, str2)0,strcmp(str1, str2)0,strcmp(str1, str2)0,strcmp(str1, str2)=0,25/30,2019/7/30,25,(4) 字符串连接函数 strcat( ),调用格式:strcat(str1
16、,str2) 功能:把str2中的字符串连接到str1字符串的后面,结果放在str1数组中.,Str1 必须 足够大,输出结果: beijing and shanghai,例如: char str121=“beijing and “; char str2 =“shanghai“; strcat(str1,str2); printf(“%s“,str1);,26/30,(5)字符串逆置函数strrev(),调用格式:strrev(str) 功能:将字符串str 前后颠倒,char str10=“china”; strrev(str); puts(str);,输出:anihc,27/30,小练习:
17、,输入三个字符串,输出最大的字符串,28/30,5.3.6 字符串数组,一维字符数组可以存储一个字符串,二维字符数组可以存储多个字符串,称为字符串数组。字符串数组的每一行元素中都含有字符串结束符0,因此它的一行元素可以和字符串一样输入、输出及初始化。 如: char color 10=“red“, “blue“, “yellow“, “green“, “purple“;,例15:输入n,输入n个字符串输出最大字符串,字符串数组可以用二维字符数组存储。,29/30,假定字符串个数不多于100个,每个字符串长度不超过80,例15:输入n,输入n个字符串输出最大字符串,(1)用第一个数str0做临时最大值max (2)擂台赛:for(i=1;in;i+)如果stri比max大,则替换max (3)输出max,30/30,#include #include #define N 100 #define LEN 81int main() char strNLEN, maxStrLEN;int n,i;scanf(“%d“, ,该程序运行结果有问题: 输入5,但只能读入4个字符串,就输出了最大值 为什么?分析一下 到VC中跟踪一下!,输入5之后的输入那个回车被读入作为str0了 如何解决? 在scanf(“%d”,之后加一getchar()语句吃掉回车,