导图社区 第05课 数组和字符串
第05课 计算机 c语言基础学习 数组和字符串,使用双引号可直接将字符数组初始化为字符串。分享给大家学习使用。
编辑于2022-04-19 23:50:47第05课 数组和字符串
数组
构造数据类型之一
数组(Array)是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素(Element)
数组中各元素的数据类型必须相同
访问数组元素时,下标的取值范围为 0 ≤ index < length,过大或过小都会越界,导致数组溢出,发生不可预测的情况
数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙
数组内存是连续的
连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用
课时一 一维数组
一维数组
所谓一维数组是指只有一个下标(index)的数组,它在计算机的内存中是连续存储的
一维数组的形式: <存储类型> <数据类型> <数组名>[length]
例如:int a[6] 存储类型为:auto 数据类型为:int 数组名为:a
数组名:表示内存首地址,是地址常量 sizeof(数组名) 是数组占用的总内存空间 编译时分配连续内存 内存字节数=数组维数 * sizeof(元素数据类型)
“数组名”存的是数组在内存当中的起始地址,即“数组名”存的就是a[0]的地址 此例中:“数组名”——a,是地址常量,不可以修改
Tips:%p 按地址格式打印,& 是取地址
一维数组的引用
数组必须先定义,后使用
只能逐个引用(写入或读取)数组元素,不能一次引用整个数组
数组元素的表示形式:数组名[下标] 其中:下标可以是常量或整型表达式
注意事项
C语言对数组不作越界检查,使用时一定要注意!!! 数组定义时就要明确指定长度,在定义后数组长度不能发生改变了,之后的地址都是未初始化过的地址,里面有什么东西都是不知道的,所以不能使用,也就是数组越界了。
可以用变量定义数组维数——例如:int i = 15; int a[i]
一维整型数组
一维整型数组的初始化
数组不初始化的话,则其元素值为随机数
对static数组元素不赋初值,系统会自动赋以0值
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0
对于short、int、long,就是整数 0;
对于char,就是字符 '\0';(ASCII 码表中的第 0 个字符,英文称为 NUL)
对于float、double,就是小数 0.0。
int a[]={1,2,3,4,5,6}; //编译系统根据初值个数确定数组维数,确定后则数组长度就不能改变了,小心数组越界问题
一维整型数组的元素个数
n = sizeof(数组名) / sizeof(int)
实例:冒泡排序and简单选择排序
一维字符数组(见下述“字符数组”)
课时二 二维数组
二维数组
二维数组的形式:(声明时列数不能省略,行数可以!!!) <存储类型> <数据类型> <数组名>[length1(行)][length2(列)]
例如: int a[3][4] 存储类型为:auto 数据类型为:int 数组名为:a 行名(或者叫“一维数组名”):a[0],a[1],a[2]
二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]
二维数组在概念上是二维的,但在内存中是连续存放的; 换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙 在C语言中,二维数组是按行排列的,即放完一行之后再放入第二行 因此,可以这样理解:二维数组是由多个长度相同的一维数组构成的
二维数组的引用
数组元素的表示形式:数组名[下标][下标] 其中:下标可以是常量或整型表达式
二维整型数组
二维整型数组的初始化
按行分段赋值
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行连续赋值
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
可以只对部分元素赋值,未赋值的元素自动取“零”值
如果对全部元素赋值,那么第一维的长度可以不给出,即行号可以省略 例如:int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
二维字符数组(见下述“字符数组”)
多维数组
具有两个或两个以上下标的数组称为多维数组
课时三 字符数组和字符串
字符数组
用来存放字符的数组称为字符数组
char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度
字符数组实际上是一系列字符的集合,也就是字符串(String)。 在C语言中,没有专门的字符串变量,没有 string 类型,通常就用一个字符数组来存放一个字符串。
C语言规定,可以将字符串直接赋值给字符数组
注意:字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。 
注意:当以%s输出字符串时,要确保字符数组最后有‘\0’,不然会出现错误
字符数组的初始化
数组不初始化的话,则其元素值为随机数
对static数组元素不赋初值,系统会自动赋以0值
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 \0
字符数组的初始化
逐个字符赋值
逐个字符地给数组赋值并不会自动添加'\0' 例如:char str[] = {'a', 'b', 'c'}; 则数组 str 的长度为 3,而不是 4,因为最后没有'\0'
用字符串常量
当用字符数组存储字符串时,要特别注意'\0',要为'\0'留个位置; 这意味着,字符数组的长度至少要比字符串的长度大 1。 例如:char str[7] = "abc123"; "abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的'\0'。如果将 str 的长度定义为 6,它就无法容纳'\0'了。 由" "包围的字符串会自动在末尾添加'\0' 注意:当以%s输出字符串时,要确保字符数组最后有‘\0’,不然会出现错误
字符串
C语言中是没有字符串变量的,用字符数组处理字符串
字符串是一系列连续的字符的组合
在C语言中,字符串总是以'\0'作为结尾,所以'\0'也被称为字符串结束标志,或者字符串结束符。 '\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。 该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。 '\0'至关重要,没有'\0'就意味着永远也到达不了字符串的结尾。 由" "包围的字符串会自动在末尾添加'\0' 例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'\0',这个过程是在后台默默地进行的,所以我们感受不到。
C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到'\0'就认为到达了字符串的末尾,就结束处理。
Tips:0、‘\0’以及Null是一回事,到数值型写0,到字符型写\0,到指针时写Null
就目前学到的知识而言,int、char、float 等类型的变量用于 scanf() 时都要在前面添加&,而数组或者字符串用于 scanf() 时不用添加&,它们本身就会转换为地址。
课时四 字符串函数
C库中实现了很多字符串处理函数,使用时需要添加头文件: #include <string.h>
strlen函数
字符串长度函数:strlen 格式:strlen(字符串) 功能:计算字符串长度 返值:返回字符串实际长度,不包括‘\0’在内 \xhh表示十六进制数代表的符号 \ddd表示八进制的
例如:对于以下字符串,strlen(s)的值为: char s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’}; //strlen(s) = 1,遇到\0认为字符串结束了 char s[10]={ ‘A’,’0’,‘B’,‘C’,‘\0’,‘D’}; //strlen(s) = 4,’0’的ASCII码是48 char s[ ]=“\t\v\\\0will\n”; // strlen(s) = 3,遇到转义的时候,转义字符\t算一个整体 char s[ ]=“\x69\141\n”; // strlen(s) = 3,\x69、\141、\n分别算一个整体
strcpy函数
字符串拷贝函数:strcpy 格式:strcpy(字符数组1,字符串2) 功能:将字符串2,拷贝到字符数组1中去;如果字符数组1中本来有字符,则会全部被覆盖掉(因为连同‘\0’一块拷贝了)。 返值:返回字符数组1的首地址 说明: (1)字符数组1必须足够大 (2)拷贝时‘\0’一同拷贝
strcat函数
字符串连接函数:strcat 格式:strcat(字符数组1,字符数组2) 功能:把字符数组2连到字符数组1后面(字符数组1和字符数组2必须都是字符串!!!,因为这本身就是字符串的连接函数) 返值:返回字符数组1的首地址 说明: (1)字符数组1必须足够大 (2)连接前,两串均以‘\0’结束(即两串都是字符串);连接后,串1的‘\0’取消,新串最后加‘\0’
strcmp函数
字符串比较函数:strcmp 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止 返值:返回int型整数 (1)若字符串1 < 字符串2, 返回负整数(-1) (2)若字符串1 > 字符串2, 返回正整数(1) (3)若字符串1 == 字符串2, 返回零
扩展用法
strncpy(p, p1, n) 复制指定长度字符串,即部分覆盖
strncat(p, p1, n) 附加指定长度字符串
strcasecmp(p, p1)忽略大小写比较字符串
strncmp(p, p1, n) 比较指定长度字符串
strchr(p, c) 在字符串中查找指定字符,返回值为该字符在字符串中第一次出现的地址 strrchr(p, c) 在字符串中查找指定字符,返回值为该字符在字符串中最后出现的地址 通过和起始地址相比,可以得到该字符在字符串中的下标
strstr(p, p1) 查找字符串
需要加头文件 :#include <ctype.h>
isalpha() 检查是否为字母字符 isupper() 检查是否为大写字母字符 islower() 检查是否为小写字母字符 isdigit() 检查是否为数字
toupper(int c)功能是把字母字符转换成大写,非字母字符不做出处理 tolower(int c)功能是把字母字符转换成小写,非字母字符不做出处理
Tips:EOF是End Of File的意思,在C语言中定义的一个宏,用作文件结束标志(ctrl+D)。