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里面的字符串复制给dprintf("%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;
}