数组与字符数组"/>
一维数组与字符数组
5.1上节课的OJ作业讲解
如何判断回文数:
此时input:123321
输出为:1 \n 2 \n 3 \n 3 \n 2 \n 1
课时作业:
暴力for循环:
5.2一维数组
1.数组的定义:
某班的学生的学习成绩,一行文字,一个矩阵等数据的特点如下:
(1)具有相同的数据类型。
(2)使用过程中需要保留原始数据
C语言为了方便操作这些数据,提供了一种构造数据类型——数组。所谓数组,是指具有相同数据类型的数据的有序集合。
定义一个整型数组,数组名为a,它有10个元素。
声明数组是要遵循以下规则:
(1)数组名的命名规则和变量名相同,即遵循标识符命名规则。
(2)在定义数组时,需要指定数组中的元素的个数,方括号中常量表达式用来表示元素的个数,即数组长度。
(3)常量表达式可以包含常量和符号常量,但不能包含变量,也就是说。C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中的变量的值。
这是不可以的。(n是变量)
以及数组其他声明错误。
2.一维数组在内存中的存储。
(1)
下面这种数组初始化的方式是错误的,直接初始化数组赋值就可以了。
(2)
初始化一部分数组,注意后面未初始化的值其实是0.
在memory view(内存视图)中通过查找&a
(3)如果要使数组元素全为0。不要傻傻的去填写10个0。
每个元素都是整型元素,占用四个字节。 4*5=20个字节。
(4)在对全部数组元素赋初值是,由于数据的个数已经确定,因此可以不指定数组的长度。
5.3数组访问越界与数组的传递
1.数组的访问越界
下面借助一个数组的实例来掌握数组元素的赋值,访问越界,下面例子中给出了该例的全部代码。
ep:一维数组的存储及访问越界
那么i的值为什么会变成7呢?我们来看一下memory view。
通过小虫子一步步下移,我们发现:
下勾
下勾(a[6]将其覆盖))
下勾
他把7存储到了原来i的位置,造成了数据异常,i的值从而发生改变。
这就是越界访问的危害。
在变量窗口输入sizeof(a),可以看到数组a的大小为20字节,计算方法其实就是sizeof(int)*5:
数组中有5个整型元素,每个元素的大小为4个字节,所以共有20字节。访问元素顺序是依次从a[0]d到a[4]。
数组另一个值得关注的是,编译器并不会检查程序对数组下标的引用是否在数组的合法范围内,这种不加检查的行为有好处也有坏处:
好处是不需要浪费时间对有些已知正确的数组下标进行检查,坏处是这样做将无法检测出无效的下标引用。一个良好的经验法则是:
如果下标值是通过那些已知正确的值计算而来的,那么就无需检查;如果下标值是由用户输入的数据产生的,那么在使用他们之前就必须进行检查,以确保它们在有效范围内。
2.数组的传递
最小的是a[0]=1,最大是a[4]=5,逐行输出数组的元素。
int i;
int a[5]={1,2,3,4,5};
for(i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
与主函数main函数不同的是:
如何在for循环中动态判断数组长度,并输出:
难道是使用:
i<sizeof(a)/sizeof(int)
错咯,原因如下:
操作调试按钮:与折弯按钮(F8)不同的是 F(7)步入,即向下箭头F7到达某个函数,要进入自己的子函数。
void子函数:(子函数是把某一个常用功能封装起来,重复使用)
数组名传递到子函数后,子函数的形参接受到的是数组的起始地址,因此不能把数组的长度传递到子函数。
而不应该在子函数定义里面写上a[5],而是直接加上一个形参 int length;
主函数是这样的:
子函数是这样的:
只是想告诉大家在传递给子函数时,数组的长度是传递不过去的。
5.4字符数组与scanf读取字符串
字符数组初始化及传递
scanf读取字符串
1.字符数组初始化及传递
字符数组的的定义方法与前面介绍的一维数组类似:
字符需要用单引号引用起来。
但是工作中一般不采取以上两种两种方式,因为字符数组一般用来存取字符串,通常采用的初始方式是char[10]=“hello”.因为C语言规定字符串的结束标志是‘\0’,而系统会对字符串常量自动加入一个‘\0',为了保证处理方法一致,字符数组存储的字符串长度必须比字符数组少一个字节,例如:char c[10]最长存储9个字符。
自定将字符串中的字符放到数组里面:
我们通过printf函数模拟实现%s打印效果,当c[i]为’\0‘时,其值为0,循环结束,
也可以写为c[i]!='\0'.
2.scanf读取字符串
较为easy:
通过下例我们可以看懂:
scanf通过%s读取字符串,对c和d分别输入“are”和“you”(中间加一个空格),scanf在使用%s读取字符串时,会忽略空格和回车。
5.5 gets与puts讲解,strlen-strcmp-strcpy讲解
1.gets函数类似于scanf函数,用于读取标准输入,前面我们已经知道scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用gets函数进行读取。
gets函数的格式如下:
get函数从stdin(标准输入)读取字符并把它们加载到str(字符串)中,直到遇到换行符(\n).如下例,执行后,我们输入”how are you“,共11个字符,可以看到gets会读取空格, 同时可以看到我们并未给数组进行初始化赋值,但是最后有’\0‘,这是因为gets遇到\n后,不会存储\n,而是将其翻译为空字符’\0‘。
puts函数类似于printf函数,用于输出标准输出,puts函数的格式如下。
函数puts把str(字符串)写入到stdou(标准输出)。puts会将数组c存储的”how are
you“字符串打印到屏幕上。同时打印换行,相对于printf函数,puts只能用于输出字符串,同时多打印一个换行符,等价于printf("%s\n",c)
2.str 系列字符串操作函数(初试没那么重要,对于机试更加重要一些)
str系列字符串主要包括strlen,strcpy,strcmp,strcat等,strlen函数用于统计字符串长度,strcpy函数用于将某个字符串复制到字符数组中,strcmp函数用于比较两个字符串的大小。strcat函数用于将两个字符串连接到一起。
各个函数具体格式如下:
导入模块:
定义类型:
通过strlen函数计算的字符串的长度为5
我们自己写的函数就是strlen函数的计算原理,通过判断结束符来确定字符串的长度。
当读取到 "\0" 的时候,while循环停止
这里的i++是先赋值再加。所以当i=5的时候不通过,还要再加上1,为6,最后return i-1。
strcat是将两个字符串连接到一起。(将一个字符串(d)接到另外一个字符串(c)的末尾)
字符数组c中的是’hello‘,我们将d中的”world“与c拼接,最终结果为”helloworld“。注意:
目标数组必须大于拼接后的字符串的大小,
output:
strcpy函数就是用来将字符串逐个的赋值给目标字符数组,例子中我们将c复制给d,就是将c中的每个字符依次赋值给d,也会将结束符赋值给d,注意:目标数组一定要大于字符串大小,
即sizeof(d)>strlen(c),否则会造成访问越界。
output:
strcmp函数
注意strcmp是比较ASCII值,不是比较字符串的长度。
当左操作数大于右操作数,输出1。/ 相等为0 /小于输出-1.
这里相等,输出为0,c和d都为helloworld。
更多推荐
一维数组与字符数组
发布评论