C语言中的字符串-PPT(精).ppt
文本预览下载声明
C语言中的字符串 教师:柳宏川 郑州大学信息工程学院 主要内容 字符串 字符串结束标志 字符数组 指向字符串的指针 问题引入 所有的C程序都做同一件事,观察一个字符,然后啥也不干。 ——Peter Weinberger 从编译器的角度来看C的字符串。 从系统处理的角度来看C的字符串。 从物理存储上来看C的字符串。 ! EMAIL:IEHCLIU@ZZU.EDU.CN 郑州大学信息工程学院 柳宏川 * EMAIL:IEHCLIU@ZZU.EDU.CN 郑州大学信息工程学院 柳宏川 1.字符串和字符串结束标志 字符串字面量的描述方式: 用一对双引号括起的任意字符序列就是一个字符串。例如:“Beijing” 对于程序中写出的一个字符串字面量,系统将用字符数组的形式对其进行存储;分配连续的若干个存储单元,把字符串中的字符按顺序存储,每个字符占据一个字节。 一个特殊的规定:在存储了字符串常量的所有字符之后,还有另外存一个空字符‘\0’作为字符串的结束标志。 字符数组就是以字符作为元素的数组。 字符数组也是数组,其定义方式与其它数组没有什么区别。 对于字符数组,定义时进行初始化也可以像其它数组一样。 2.字符数组 c[9] c[8] c[7] c[6] c[5] c[4] c[3] c[2] c[1] c[0] y p p a h m a I 【例如】把10个字符分别赋给 c[0]到c[9]的10个元素。 char c[10]={‘I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’}; 例如:“Beijing”虽然它只有 7 个字符,其内部表示却要占据 8 个字节的存储单元。 \0 g n i j i e B 3.字符串与字符数组的关系 有效字符串的长度与存放字符串的数组长度是两个不同的概念。 例如,定义一个字符数组长度为 100,而实际有效字符只有 40个。 4.程序中怎样才能从字符串的内部表示确定其结束的位置呢? 在处理字符串时进行顺序检查,遇到空字符就表示遇到了字符串的结束。 /*是字符串*/ ‘x’ ‘\0’ ‘k’ ‘o’ char d[4] = {‘o’,’k’,’\0’,’x’}; /*是字符串*/ 0 ‘\0’ ‘k’ ‘o’ char c[4] = {‘o’,’k’,’\0’}; /*是字符串*/ 0 ‘d’ ‘a’ ‘b’ char b[4] = {‘b’,’a’,’d’}; /*不是字符串,缺少空字符*/ ‘d’ ‘o’ ‘o’ ‘g’ char a[4] = {‘g’,’o’,’o’,’d’}; char a[18] = ”Hi!\0Good\0morning!\0”; 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 \0 ! n g \0 r m o d o o \0 i G \0 ! i H 【例】是字符串吗? a或a[0]:表示字符串“Hi!” a[1]:表示字符串“i!” a[3]:表示空字符串“” a[5]:表示字符串“ood” a[12]:表示字符串“ing!” 系统处理处理字符串的做法:从一个字节的地址开始,向后进行顺序扫描,遇到第一个空字符null(‘\0’)的字节,这两个字节之间的字符序列就是一个字符串。 再看前面的例子 系统会怎么看待该字符数组? /*不是字符串,缺少空字符*/ ‘d’ ‘o’ ‘o’ ‘g’ char a[4] = {‘g’,’o’,’o’,’d’}; 作为字符数组:在下标0到3的范围内对每一个数组元素进行访问,逻辑上都没问题。 作为字符串:从数组名表示的地址(a[0])开始,向后进行顺序扫描,逻辑上在数组范围内是碰不到‘\0’的,逻辑上不是字符串。但计算机内存是连续的,该字符数组只是内存字节序列中的一段,在最后一个元素a[3]后物理上依然存在字节。在这些字节中,每个字节的二进制数据就代表着一个ASCII码字符,肯定会有一个字节存储的是空字符null(‘\0’)的,这两个字节之间的字符序列就是一个字符串。当然, a[3]后的字符不是逻辑上的字符串。 int main() {int i; char ch1[5]={ZYXWV}; char a[20]=ABCDE\0FGHIJ\0KLMNOP; char ch2[5]={abcde}; scanf(%s,a[3]); printf(%s\n,a); printf(%s\n,a[3]); printf(%s\n,a[5]); printf(%s\n,a[9]); printf(%s\n,a[12]); printf(%s\n,a); for(i=-3;i=22;i++)
显示全部