
字符串使用ppt课件.ppt
43页1.6 字符数组和字符串使用,赵修彬 山东省聊城第一中学,,字符类型知识回顾 字符数组与字符串基础知识 字符数组与字符串操作,1.6.1 字符,计算机程序处理的数据类型也可以概括的分为数值型数据和非数值型数据两大类,前面学习的内容多以数值型数据的运算或处理为主,接下来我们开始了解一种最基本的非数值型数据的处理知识字符类型; 字符类型为由一个单个字符组成的数据通常使用一对单引号将单个字符括起来的表示形式,如a 、 、.等 程序设计中常用到的是字符常量或字符变量1.6.1 字符,字符常量定义: const 字符常量标识符=单个字符; 例如: const ch1=A; 说明:本语句说明或定义了一个字符类型的常量,该常量表示的字符数据为A 字符变量是用来存放单个字符的变量,即只能表示一个单个字符; 字符变量定义: char 字符变量标识符; 例如: char ch1,ch2; 表示定义了两个字符变量ch1和ch2,每个变量进可以表示或者存放一个字符,因此可以利用如下语句赋值: ch1=a ; ch2=b ;ch1= 也开始相互赋值 ch2=ch1;,,字符与整数的通用性(对应性)关系 前面我们知道,字符数据在内存中是以该字符对应的ASCII编码存储,也即是说每一个常见字符在内存中都与一个唯一的序值一一对应。
在实际程序设计中,一个字符数据既可以以字符形式输出,也可以以整数(ASCII表中的序值)形式输出,还可以对它们进行算术运算字符和整数之间的通用性(对应性)验证:,,字符与整数的通用性(对应性)验证 字符数据和整数数据进行基本运算:,,字符与整数的通用性(对应性)关系 利用字符和整数间的通用性来实现大小写字母的转换:,,思考1、如果我们需要将任意的大写字母转换为小写字母或者小写字母转换为大写字母,如何编写代码? 思考2、如果我们需要将从键盘中接收的英文字母进行大小写的转换,如何编写代码(假设我们输入的字符除了作为键盘字符输入结束#外都是英文字母),如何编写实现?,,例 将读入的任意英文字母进行大小写转换,,以上为单个字符的基本知识与处理,如果是连续的多个字符需要处理,我们将如何解决? 逐一处理分别对其中的每一个字符进行分别处理字符数组 整体处理将连续的字符看做一个整体进行处理字符串,1、字符数组 我们前面学习数组时已经知道:无论数组的元素有多少个,数组中每个元素的类型必须相同,而且数组元素的类型可以是任何已定义的数据类型,如整形、字符型、实型等当一个数组的元素类型为字符型时,我们称这个数组为字符数组。
字符数组的每一个元素都是一个字符 连续的单个字符) 字符数组是计算机非数值处理的基本实现方式之一 例如: char c5; c0=H;c1=e;c2=l;c3=l;c4=o; 其在内存中的存储形式如图所示:,1.6.2 字符数组与字符串基础,字符数组与字符串基础,2、字符串 字符串是一对双引号括起来的字符序列(字符组成的整体) 如”Hello world!” 、 “a b c d e f g ”、”a” 、“ ”等 特别的是,每个字符串的结尾都有一个“字符串结束标志”,以便系统据此判断字符串是否结束C++语言中用字符0作为字符串结束的标志,0是一个ASCII码为0的字符,占用一个字节,例如有一个字符串”Hello”,在内存里的实际存储如下图所示: 说明:这个字符串占用的不是5个字节,而是6个字节,最后一个字节里面存放的是字符串结束标志0但是在输出时不会输出0 又如,char st =”abcde”; st25; cout< 字符常量和字符串常量区别 两者的定界符不同,字符常量由单引号括起来,字符串常量由双引号括起来 字符常量只能是单个字符,字符串常量则可以是多个字符 可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量 字符常量占一个字节,而字符串常量占用字节数等于字符串的字节数加1增加的一个字节中存放字符串结束标志0例如:字符常量a占一个字节,字符串常量“a”占二个字节字符数组与字符串基础,字符数组的操作,3、字符数组的定义与赋值 (1)字符数组的定义格式 字符数组定义格式同一般数组,所不同的是数组元素类型是字符型,第一个元素同样是从ch10开始,而不是ch11具体格式如下: char 数组名常量表达式1 例如: char ch15; //数组ch1是一个具有5个字符元素的一维字符数组 char ch235; //数组ch2是一个具有15个字符元素的二维字符数组,(2)字符数组的赋值 字符数组赋值类似于一维数组,赋值分为数组的初始化和数组元素的赋值初始化的方式有用字符初始化和用字符串初始化两种,也有用初始值表进行初始化的 1).用字符初始化数组 例如: char chr15=a,b,c,d,e; 初始值表中的每个数据项是一个字符,用字符给数组chr1的各个元素初始化。 当初始值个数少于元素个数时,从首元素开始赋值,剩余元素默认为空字符 如果提供的初值个数与预定的数组长度相同,在定义是可以省略数组长度,系统会自动根据初值个数确定数组长度,如: char chr1=a,b,c,d,e; 这样就定义了一个长度为5的字符数组,每一个元素如大括号内的字符 也可以定义和初始化一个二维字符数组,如: char chr33=a,b,c,d,e;,字符数组的操作,字符数组中也可以存放若干个字符,也可以来存放字符串两者的区别是字符串有一结束符(0)反过来说,在一维字符数组中存放着带有结束符的若干个字符可以称为字符串字符串是一维字符数组,但是一维字符数组不等于字符串 例如: char chr25=a,b,c,d,0; 即在数组chr2中存放着一个字符串“abcd”字符数组的操作,(2)用字符串初始化数组 用一个字符串初始化一个一维字符数组,可以写成下列形式: char chr25=“abcd”; 使用此格式均要注意字符串的长度应小于字符数组的大小或等于字符数组的大小减1(为何?)同理,对二维字符数组来讲,可存放若干个字符串可使用由若干个字符串组成的初始值表给二维字符数组初始化。 例如:char chr334=“abc”,“mno”,“xyz”;在数组ch3中存放3个字符串,每个字符串的长度不得大于3字符数组的操作,(3)字符数组元素赋值 字符数组的赋值是给该字符数组的各个元素赋一个字符值 例如: char chr3; chr0=a; chr1=b;chr2=c; 对二维、三维字符数组也是如此当需要将一个数组的全部元素值赋予另一数组时,不可以用数组名直接赋值的方式,要使用字符串拷贝函数来完成字符数组的操作,字符串的基本操作,4、字符串的输入与输出 字符串可以作为一维字符数组来处理,那么字符串的输入和输出也可以按照数组元素来处理,本节不再做介绍本节仅介绍将字符串作为一个整体进行输入和输出的语句 (1)输入 从键盘输入一个字符数组可以使用scanf语句或gets语句 1) scanf语句 格式:scanf(“%s”,字符串名称); 说明: 这里的字符串名称之前不加 说明: 用%s格式输出时,printf的输出项只能是字符串(字符数组)名称,而不能是数组元素例如:printf(“%s”,a5);是错误的 输出的内容不包括字符串结束标志符0 2) puts语句 格式:puts(字符串名称); 说明:puts语句输出一个字符串和一个换行符。 对于已经声明过的字符串a,printf(“%sn”,a)和 puts(a)是等价的字符串的基本操作,字符串中单个字符的引用: 例 C++中,一个字符串中的字符可以通过其对应的下标灵活使用 #include // gets()调用cstdio库 #include #include //strlen()调用cstring库, 调用string库在高版C++下编译出错 using namespace std; int main() char st100; gets(st); //gets为专门读字符串的 函数, 读取一行字符串 for (int i=0; i 例1.6.3 数字统计(Noip2010) 【问题描述】 请统计某个给定范围L, R的所有整数中,数字2 出现的次数 比如给定范围2, 22 ,数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6 次 【输入】 输入文件名为two.in 输入共1 行,为两个正整数L 和R,之间用一个空格隔开 【输出】 输出文件名为two.out 输出共1 行,表示数字2 出现的次数 【输入样例1】two.in 2 22 【输出样例1】two.out 6 【输入样例2】two.in 2 100 【输出样例2】two.out 20 【数据范围】 1 L R 10000,【算法分析1】 枚举L,R区间的所有整数,对于每个整数x: 先判断x的最后一位是否为2(即 x%10==2),然后将x的最后一位删除(即 x/=10),循环操作,直到x值为0参考程序2】 #include #include #include using namespace std; int main() int l,r,ans=0; cinlr; for (int i=l; i0) if (x%10==2) ++ans; x/=10; cout<












