408初级阶段1:一维数组与字符数组

(1)一维数组的定义格式:

类型说明符 数组名 [常量表达式];

例如 int a[10];

声明数组时要遵守的规则

1.数组名的命名规则和变量名相同,及遵守标识符命名规则

2.定义数组时需要指定数组元素中的个数,方括号中的常量表达式用来表达元素个数,即数组长度

3.常量表达式可以包含常量和符号常量,但不能包括变量,也就是说c语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中国变量的值(新版c标准支持,但包含变量的数组不能进行初始化)

初试复试的学校测试一般版本比较旧,最好不要包含变量

(2)一维数组的初始化方法

1在定义数组时对数组元素赋初值例如

int a[10]={0,1,2,3,4,5,6,7,8};

//而不能写成

int a[10];
a[10]={0,1,2,3,4,5,6,7,8];

2可以只给一部分元素赋值例如

int a[10]={0,1,2,3,4};

定义数组a中有十个元素,但花括号中只提供五个初值,这表示只给前五个元素赋值,剩余元素为0

3如果要让一个数组全部值为0,只需要

int a[10]={0};

不需要十个元素都打一遍,这会让批卷老师认为没有学懂c语言

4在对全部数组赋值初值时,由于数据个数确定,因此可以不指定数组长度。

例如

int a[]={1,2,3};

最好不要这样初始化,会导致改卷老师不得不数元素个数,导致步骤分的多扣

数组的访问越界

内存访问的异常,越界访问导致其他变量储存位置被覆盖

#include<stdio.h>

int main()
{
	int a[5]={1,2,3,4,5};
	int j=19;
	int g=12;
	a[5]=10;
	a[6]=13;
	printf("%d %d",j,g);
	//此时g的取值变为了13,原因为a[6]占用了g的地址,导致了g取值的变化 
	return 0;
}

另外需要注意,编译器不会检查程序对数组下标的引用是否合法

(3)数组的传递

另外注意

调试按钮折弯F8 当前函数一步步往下走

向下箭头F7 到达某个函数

#include<stdio.h>
//数组长度是无法传递的所以需要新建变量传入 
//数组名传递到子函数后,子函数的形参接受到的是数组的起始地址,所以sizeof(a)为8 
void print(int a[])
{
	int i;
	for(i=0;i<sizeof(a)/sizeof(int);i++)
	{
		printf("%d\n",a[i]);
	}
}
int main()
{
	int a[4]={1,2,3,4};
	print(a);
	return 0;
}

修改后

#include<stdio.h>
//数组长度是无法传递的所以需要新建变量传入 
//数组名传递到子函数后,子函数的形参接受到的是数组的起始地址,所以sizeof(a)为8 
void print(int a[],int len)
{
	int i;
	for(i=0;i<len;i++)
	{
		printf("%d\n",a[i]);
	}
}
int main()
{
	int a[5]={1,2,3,4,5};
	print(a,4);
	return 0;
}

(4)字符数组的初始化

对每个单独赋值进行初始化非常麻烦,而对整个初始化也很麻烦,所以一般的初始化格式为

char a[9]="i am happy";//好处有两点
//1.容易输入
//2.若数字内还有空间则自动输入结束符号\0

(5)字符数组输出乱码的情况

字符数组中没有结束符就会导致乱码,因为循环输出时会一直输出直到找到\0为止

上图的赋值必须要预留足够的空间如果没空间则不会自动输入\0

一旦输出乱码,一定要去找字符数组是否含有结束符,另最好不要输出中文字符

(6)scanf读取字符串

#include<stdio.h>

int main()
{
	char a[9];
	scanf("%s",a);
	printf("%s",a);
	return 0; 
}

注意

1.字符数组a中存储了地址,因此不用在scanf后加&

2.字符数组的scanf读取,无法读取空格,而会直接导致读取结束,空格后的内容会留在缓冲区,二次读取时会忽略最前面被预留的空格

则可以用空格分割输入的字符串,一次性输入不同的字符串中

#include<stdio.h>

int main()
{
	char a[9];
	char b[9];
	scanf("%s%s",a,b);
	printf("%s %s",a,b);
	return 0; 
}

(7)gets函数和puts函数

gets的特点:一次读一行,无论中间是否有空格或者其他符号都会读进取,直到遇到\0才停止

和scanf的读取特点相反,scanf最后读取到空格直接停止

puts的特点:puts(a);等价于printf("%s\n",a);

(8)str系列(初试不重要,复试的机试会涉及)

strlen()算出字符数组的长度(忽略\n)

#include<stdio.h>

int main()
{
	char a[9];
	char b[9];
	scanf("%s%s",a,b);
	printf("%s %s",a,b);
	int len=0;
	len=strlen(a);
	printf("%d",len);
	return 0; 
}

strcat(a,b)将a和b字符串相接,即将b中的内容拼接到a中

#include<stdio.h>

int main()
{
	char a[9];
	char b[9];
	scanf("%s%s",a,b);
	strcat(a,b);//把d的内容拼接到a 
	printf("%s %s",a,b);
	int len=0;
	len=strlen(a);
	printf("%d",len);
	return 0; 
}

strcmp(a,b)比较字符串a,b的大小  a?b中若为>返回正值,<返回负值=返回0

strcpy (a,b)将b复制进a

注意

strcpy(a,b)和strcat(a,b)中a的取值不能为字符串常量,必须有空间,否则无法拼接或者复制

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值