一、一维数组
1.1定义及格式
数据类型 数组名【元素个数】
例如:
1、存储班级同学年龄,班级有5人
int //年龄整型
age//自定义数组名
5//元素:数组内的数据个数
int age[5]
1.2数组下标
下标:从0~数据个数-1
1.3变量定义
定义时必须要有明确的空间 例如:int a[10]; float b[4]; char ch[5]="12345";
1.4数组初始化
列如 int a[10]={'\0'}; ----- 不用\0清除数据,可能会有之前的数据留在内存里
1.5数组的注意事项
1、数组只能在初始化的时候整体赋值。
2 、数组名是数组首元素的地址
3、数组只能在初始化的时候整体赋值。
例: int b[5] = {1,2,3,4,5};
错误写法,警惕警惕!!!!
int b[5]; // 数据总个数
b[5] = {1,2,3,4,5}; // 错误 使用的时候[]里面是下标
int c[5];
c = {1,2,3,4,5}; // 错误 不对 c是数组名,它是首元素的地址
4、数组名是数组首元素的地址
int a = 30;
//printf("%d\n",a); 查看空间里面的数据
printf("%p\n",&a); // 获取内存分配给a的地址
错误写法int b[5];
b = {1,2,3,4,5}; // 错误 相等于是写 0x0062Fe9C = {1,2,3,4,5};
//不能给常量赋值
int c[5] = {1,2,3,4,5};
int d[5];
d = c; // 相当于 0x0062Fe9C = 0x0062Fe90
int i;
for(i=0;i<5;i++)
{
d[i] = c[i];
}
二、二维数组
2.1定义格式
数据类型 数组名[行数][列数]; 例: int a[2][3];
2.2解析
a的类型:int [2][3]
a[0]和a[1]的类型:int [3]
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]的类型: int
#include<stdio.h>
int main(void)
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int i,j,c;
for(i=0;i<3;i++)
{
int sum = 0; // 在列循环前重置变量sum=0;便于每行求和
for(j=0;j<3;j++)
{
c=a[i][j];
sum = sum +c;
printf("a[%d][%d]:%d ",i,j,c);
}
printf("和: %d\n",sum);
}
}
三、字符串和字符数组
3.1初始化
初始化可以简写 例如 char name[5]="a,b";-------//{'a','b','\0','\0','\0'}
省略数据个数 例如 int a[]={1,2,3};
3.2字符串的专用格式控制符
%s ----------输入输出只需要给字符串首地址即可,遇到\0结束
例: char b[] = "abcdefghijklmnopqrstuvwsyz";
printf("%s",&b[0]);
3.3字符串处理函数
//-求字符串长度不包含\0,遇到\0结束
#include<stdio.h>
#include<string.h>
int main()
{
char name[20];
printf("请输入您的姓名: ");
scanf("%s",&name[0]);
int len = strlen(&name[0]);
if(len < 8 || len > 12)
{
printf("no");
}
else
{
printf("yes");
}
return 0;
}
//strcat --- 拼接 “hello” "world" "hello world"
//-求字符串长度不包含\0,遇到\0结束
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100] = "hello";
char str2[20] = "world";
char *res = strcat(str1,str2);
printf("%s",res);
printf("%s",str1);
return0;
}
//strcmp --- 比较
#include<stdio.h>
#include<string.h>
int main()
{
// 用户登录界面
char name1[]="lili";
char key1[]="123456";
char name2[100]={'\0'};
char key2[]={'\0'};
printf("请输入用户名\n");
scanf("%s",&name2[0]);
int n = strcmp(name1,name2);
if(n == 0)
{
printf("请输入密码\n");
scanf("%s",&key2[0]);
int k = strcmp(key1,key2);
if(k==0)
{
printf("登陆成功");
}
else
{
printf("请重新输入密码");
}
}
else
{
printf("请重新输入用户名");
}
return0;
}
//strcpy --- 拷贝 char names[30]; 定义后整体赋值用strcpy
#include<stdio.h>
#include<string.h>
//char *strcpy( char *to, const char *from );
int main()
{
char names[30];
strcpy(names,"xiaoming");//xiaoming拷贝到names
printf("%s",names);
return0;
}
//strstr --- 在一个字符串里面定位另外一个字符串。
#include<stdio.h>
#include<string.h>
//char *strstr( const char *str1, const char *str2 );
//函数返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。
int main()
{
//"temp:36.50,humid:200"
char *res = strstr("temp:36.50,humid:200","temp1:");//字符串内没有找到"temp1:"
if(res == NULL)
{
printf("no");
}
else
{
printf("yes");
}
return0;
}
//strchr --- 在一个字符串里面定位一个字符
//char *strchr( const char *str, int ch );
//函数返回一个指向str 中ch首次出现的位置,当没有在str 中找ch到返回NULL。
#include<stdio.h>
#include<string.h>
int main()
{
char *res = strchr("hello",'l');//"hello"内找l
if(res == NULL)
{
printf("no");
}
else
{
printf("%s",res);
}
return0;
}
//memset --- 整体设置内存 --- 将一段内存空间填入某值
//void *memset( void *buffer, int ch, size_t count );
#include<stdio.h>
#include<string.h>
int main()
{
char names[15] = "hello world";//15只是为了有足够空间而随机定义的数char型1个字符为1字节
memset(names,'t',6);
printf("%s",names);
return0;
}
函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。
例如:
memset( the_array, '\0', sizeof(the_array) );
// sizeof -- 求空间字节数 可以放数据类型也可以放空间的名称
// printf("%d",sizeof(int)); // 4
// int a;
// printf("%d",sizeof(a)); // 4
// int a[5];
// printf("%d",sizeof(a)); // 在sizeof里面数组名代表空间名称 -- 计算整个空间有多少字节 --- 20
//memcpy --- 从一个字符串拷贝n个字符到另外一个字符串里面
#include<stdio.h>
#include<string.h>
int main()
{
char str1[40] = "xxxxtemp:36.50,humid:200";
char t[8] = {'\0'};
// 定位temp: strstr
// 跨越 temp: + 5
// 拷贝 5个字符目标数组里面去 memcpy
char *res = strstr(str1,"temp:");
if(res == NULL)
{
printf("找不到");
}
else
{
res = res + 5; // char *指针偏移5个char
memcpy(t,res,5);
printf("%s",t);
}
return0;
}
void *memcpy( void *to, const void *from, size_t count );
函数从from中复制count 个字符到to中,并返回to指针。
如果to 和 from 重叠,则函数行为不确定。
3.4通性
char *str1 可以通过str1对它指向的字符串进行读写操作
const char *str1 可以通过str1对它指向的字符串进行读操作,不能写