一维数组与字符数组

编程入门 行业动态 更新时间:2024-10-18 06:08:15

一维<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组与字符数组"/>

一维数组与字符数组

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。

更多推荐

一维数组与字符数组

本文发布于:2024-03-09 01:42:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1723273.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   字符

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!