5.2
数组基础知识
注意要点:
1.下标0开始
2.没有定义的地方是0
5.3
数组访问越界与数组传递
访问越界,定义超过前面定义的数组长度,占据了后面定义数据的地方
非常危险!
在循环里面往往容易造成越界
数组传递
1.函数引用时直接放数组名字
int main() {
int a[9]={1,2,3,4,5,7};
for(int i=0;i<sizeof(a)/sizeof(int);i++)
{
printf("%d\n",a[i]);
}
// print(a);
return 0;
}
这样可以正常输出:
但是把它放到上面函数里面就只能输出1,2
#include <stdio.h>
void print(int a[])
{
for(int i=0;i<sizeof(a)/sizeof(int);i++)
{
printf("%d\n",a[i]);
}
}
int main() {
int a[9]={1,2,3,4,5,7};
print(a);
return 0;
}
数组放在函数体里面时,相当于弱化为指针,指针是八个字节,所以在函数体里面不能用sizeof
8/4(int)=2也就是只输出两个
这时我们就需要一个新的参数把数组长度传过去
length
#include <stdio.h>
void print(int a[],int length)
{
for(int i=0;i<length;i++)
{
printf("%d\n",a[i]);
}
}
int main() {
int a[6]={1,2,3,4,5,7};
int length=6;
print(a,length);
return 0;
}
5.4字符数组
要注意:后面有八个字母,但是最后还有\0所以要至少有九个位置
#include <stdio.h>
int main() {
char c[10]="Iamhappy";
printf("%s\n",c);
return 0;
}
%s是输出字符串
当数组没有将\0包含进去,数组危险,可能读到一些其他的数据
换成【6】就没事了
输出字符串乱码时,要去看字符数组中是否存储了结束符‘\0’
模仿%s的功能函数
#include <stdio.h>
void print(char d[])
{
int i=0;
while(d[i])
{
printf("%c",d[i]);//当取到终止符得时候,循环结束
i++;
}
printf("\n");
}
int main() {
char c[10]="Iamhappy";
print(c);
return 0;
}
读取字符串
#include <stdio.h>
//scanf读取字符串
int main() {
char c[10];
scanf("%s",c);//数组名c中存储了数组的起始地址,因此不需要取地址了
printf("%s\n",c);
return 0;
}
而且数组不读回车和空格,读到就停止
#include <stdio.h>
//scanf读取字符串
int main() {
char c[10];
char d[10];
scanf("%s%s",c,d);//数组名c中存储了数组的起始地址,因此不需要取地址了
printf("%s %s\n",c,d);
return 0;
}
5.5gets与puts函数
gets自由读取
#include <stdio.h>
int main() {
char c[20];
gets(c);//gets中放入数组名字
printf("%s\n",c);
return 0;
}
puts里面只能放字符数组名字
#include <stdio.h>
int main() {
char c[20];
gets(c);//gets中放入数组名字
puts(c);//等价于printf("%s\n",c);
return 0;
}
str系列字符串操作函数
strlen计算长度
#include <stdio.h>
#include <string.h>
int main() {
int len;
char c[20];
char d[20]="world";
gets(c);
puts(c);
len=strlen(c);//统计字符串的长度
printf("%d\n",len);
return 0;
}
模仿strlen函数
#include <stdio.h>
#include <string.h>
int mystrlen(char c[])
{
int i=0;
while(c[i])
{
i++;
}
return i;
}
int main() {
int len;
char c[20];
char d[20]="world";
gets(c);
puts(c);
len=strlen(c);//统计字符串的长度
printf("len=%d\n",len);
len= mystrlen(c);
printf("my len=%d\n",len);
return 0;
}
strcat拼接
int main() {
int len;
char c[20];
char d[20]="world";
gets(c);
puts(c);
strcat(c,d);//把d里面的字符拼接到c里面
printf("%s\n",c);
return 0;
}
strcpy复制
int main() {
int len;
char c[20];
char d[20]="world";
gets(c);
puts(c);
strcat(c,d);//把d里面的字符拼接到c里面
printf("%s\n",c);
strcpy(d,c);//把c里面的字符串复制给d
printf("%s\n",d);
return 0;
}
strcmp比大小
比靠前的字符的ASCII码大小
int main() {
int len;
char c[20];
char d[20]="world";
gets(c);
puts(c);
puts(d);
printf("%d\n", strcmp(c,d));//前面大正值,后面大负值,一样大0
}
oj作业
第一题:
正确代码:
#include <stdio.h>
#include <string.h>
int main() {
int a[100];
int n;
int j=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int z=0;z<n;z++)
{
if(a[z]==2)
{
j++;
}
}
printf("%d\n",j);
return 0;
}
一开始写的错误代码:
#include <stdio.h>
#include <string.h>
int main() {
int a[100];
int n;
int j=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int z=0;z<n;z++)
{
if(a[z]==2)
{
j++;
}
}
printf("%d\n",j);
return 0;
}
第二题:
(中间有些东西没有考虑到,一遍一遍的改错:( )
#include <stdio.h>
#include <string.h>
int main() {
char a[20];
gets(a);
char b[20];
for(int i=0;i< strlen(a);i++)
{
b[strlen(a)-1-i]=a[i];
}
int result=strcmp(a,b);
if(result>0)
{
printf("%d\n",1);
}
else if(result<0)
{
printf("%d\n",-1);
}
else{
printf("%d\n",0);
}
return 0;
}