知识点1【sscanf高级用法】
1、%[a-z] 提取a-z的字符串
void test01()
{
char buf[128]="";
//%[]都是 按 字符串 提取
sscanf("abcDefABC","%[a-z]",buf);
printf("buf=%s\n", buf);//"abc"
return;
}
2、%[aBc] 提取 a B c
void test02()
{
char buf[128]="";
sscanf("aaBBcEdef","%[aBc]",buf);
printf("buf=%s\n", buf);//aaBBc
}
3、%[^abc] 只要不是a b c任何一个 都要
void test03()
{
char buf[128]="";
sscanf("ABCcABC","%[^abc]",buf);
printf("buf=%s\n", buf);//ABC
}
案例:
void test04()
{
char name[32]="";
char addr[32]="";
//sscanf("[email protected]","%[^@]%*1s%[^.]",name,addr );
//sscanf("[email protected]","%[^@]%*c%[^.]",name,addr );
sscanf("[email protected]","%[^@]@%[^.]",name,addr );
printf("name=%s\n",name);//"lianghe"
printf("addr=%s\n",addr);//"1000phone"
}
案例:
void test05()
{
int m1=0,s1=0;
int m2=0,s2=0;
char song[128]="";
char msg[128]="[12:13.46][8:23.45]给我一个威武雄壮的汉子";
sscanf(msg,"[%d:%d%.%*d][%d:%d.%*d]%s",&m1,&s1,&m2,&s2,song);
printf("%d-%d\n",m1,s1);
printf("%d-%d\n",m2,s2);
printf("%s\n", song);
}
运行结果:知识点2【const关键字】
1、const修饰变量 为只读
void test06()
{
//const 修饰num为只读变量 num只能取值 num不能被赋值
//const 修饰的变量 尽量 初始化
const int num=10;
printf("num = %d\n",num);//ok
//num = 100;//err num不能被赋值
printf("&num = %p\n", &num);
//但是如果知道 num的地址 也可以间接的修改num的值
*(int *)(&num) = 1000;//少干
printf("num = %d\n",num);
}
运行结果:2、const int p;
const在的左边 表示 const 修饰的是* 而不是 p.
效果:用户不能借助*p更改空间的内容 但是 p可以指向其他空间(*p 只读 p可读可写)
void test07()
{
int num1 = 10;
int num2 = 20;
//const在*的左边 *p只读 p可读可写
const int *p = &num1;
printf("*p = %d\n", *p);//10
//*p = 1000;//err *p只读
p=&num2;//ok p可读可写
printf("*p = %d\n", *p);//20
}
3、int * const p;
const 在的右边 const修饰的是p 而不是。
用户可以通过*p 修改p所指向空间的内容 但是 不能再更改p的指向(*p可读可写 p只读)
void test08()
{
int num1 = 10;
int num2 = 20;
//const在*的右边 *p可读可写 p只读
int * const p = &num1;//p一旦初始化 就不能更改指向
printf("*p = %d\n", *p);//10
*p = 1000;//ok *p可读可写
printf("*p = %d\n", *p);//1000
//p=&num2;//err p只读
}
4、const int * const p;(*p 只读 p只读)
void test09()
{
int num1 = 10;
int num2 = 20;
const int * const p = &num1;//*p 和 p都是只读
//*p = 1000;//err *p只读
//p = &num2;//err p只读
}
知识点3【结构体类型的定义形式】/struct 是结构体关键字 stu是结构体类型名
//使用结构体类型 必须是 struct stu
//num name age 叫做结构体中的成员
//定义结构体类型的时候 不要给成员 赋值(重要)
//定义结构体类型的时候 并没有分配空间 所以 不能给成员赋值
struct stu
{
int num=10;//4B
char name[32];//32B
int age; //4B
};//一定要记得有;号
//结构体中的成员 拥有独立的空间(重要)
#include<stdio.h>
struct stu
{
int num;//4B
char name[32];//32B
int age;//4B
};
void test01()
{
printf("sizeof(struct stu) =%d\n",sizeof(struct stu));//40B
return;
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
知识点4【结构体变量的定义】
void test01()
{
//就用结构体类型 定义一个变量
struct stu lucy;//lucy是局部变量 lucy的成员内容不确定
//通过结构体变量 访问 结构体中的成员 (一定要遵循成员自身的类型)
printf("num = %d\n", lucy.num);
printf("name = %s\n", lucy.name);
printf("age = %d\n", lucy.age);
//一定要遵循成员自身的类型
lucy.num = 100;
strcpy(lucy.name, "德玛西亚");
lucy.age = 18;
printf("num = %d\n", lucy.num);
printf("name = %s\n", lucy.name);
printf("age = %d\n", lucy.age);
return;
}
运行结果:知识点5【结构体变量的初始化】(下一)
//结构体类型的定义
struct stu
{
int num;//4B
char name[32];//32B
int age;//4B
};
void test03()
{
//初始化的顺序 必须和 结构体成员的 顺序一致
struct stu lucy={100,"德玛西亚",18 };
printf("num=%d, name=%s, age=%d\n",lucy.num,lucy.name,lucy.age);
//清空结构体变量
memset(&lucy,0,sizeof(lucy));
}
知识点6【结构体变量 获取 键盘输入】
void test04()
{
struct stu lucy;
memset(&lucy, 0,sizeof(lucy));
printf("请输入num name age:");
//&lucy.num 取的是num成员地址
scanf("%d %s %d",&lucy.num, lucy.name , &lucy.age);
printf("num=%d, name=%s, age=%d\n",lucy.num,lucy.name,lucy.age);
}
知识点7【结构体变量 之间的赋值】
void test05()
{
struct stu lucy={100,"小法", 18};
struct stu bob;
//需求 将lucy的值 赋值 bob
//方式一:逐个成员赋值
//bob.num = lucy.num;
//strcpy(bob.name,lucy.name);
//bob.age = lucy.age;
//方法二:相同类型的结构体变量 可以直接赋值(推荐)
//bob = lucy;
//方法三:方法二的底层实现
memcpy(&bob,&lucy,sizeof(struct stu));
printf("num=%d, name=%s, age=%d\n",bob.num,bob.name,bob.age);
}
知识点8【结构体数组】
void test06()
{
struct stu arr[5]={
{100,"小法",18},
{101,"德玛西亚",19},
{102,"盲僧",20},
{103,"快乐风男",30},
{104,"提莫",8}
};
int n = sizeof(arr)/sizeof(arr[0]);
int i=0;
for(i=0;i<n;i++)
{
printf("num=%d, name=%s, age=%d\n",arr[i].num,arr[i].name,arr[i].age);
}
}
运行结果:案例:定义一个结构体数组 获取键盘输入 求平均age
void test07()
{
struct stu arr[5];
int n = sizeof(arr)/sizeof(arr[0]);
int i=0;
int sum = 0;
memset(arr,0,sizeof(arr));//清空整个数组
printf("请输入%d个学生的信息\n", n);
for(i=0;i<n;i++)
{
scanf("%d %s %d", &arr[i].num, arr[i].name, &arr[i].age );
}
for(i=0;i<n;i++)
{
sum += arr[i].age;
}
printf("平均年龄为%d\n",sum/n);
}
运行结果:
知识点9【冒泡排序】下二
#include<stdlib.h>
void test08()
{
int n = 0;
int i=0,j=0;
int *arr = NULL;
printf("请输入数据的个数:");
scanf("%d", &n);
//根据元素的个数申请空间
arr = (int *)calloc(n,sizeof(int));
if(NULL == arr)
{
perror("calloc");
return;
}
//键盘给动态数组 获取输入
printf("请输入%d个int数据\n", n);
for(i=0;i<n;i++)
{
scanf("%d", arr+i);//arr+i 第i个元素的地址
}
//排序
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])//从小--->大
{
int tmp = 0;
tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
//数组的遍历
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
//释放空间
if(arr != NULL)
{
free(arr);
arr=NULL;
}
}
运行结果:冒泡排序升级版:
#include<stdlib.h>
void test08()
{
int n = 0;
int i=0,j=0;
int *arr = NULL;
printf("请输入数据的个数:");
scanf("%d", &n);
//根据元素的个数申请空间
arr = (int *)calloc(n,sizeof(int));
if(NULL == arr)
{
perror("calloc");
return;
}
//键盘给动态数组 获取输入
printf("请输入%d个int数据\n", n);
for(i=0;i<n;i++)
{
scanf("%d", arr+i);//arr+i 第i个元素的地址
}
//排序
for(i=0;i<n-1;i++)
{
int flag = 0;
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])//从小--->大 交换
{
int tmp = 0;
tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag = 1;
}
}
if(flag == 0)//数组已经有序
break;
}
printf("i=%d\n",i);
//数组的遍历
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
//释放空间
if(arr != NULL)
{
free(arr);
arr=NULL;
}
}
运行结果:知识点10【结构体数组排序】
void test09()
{
struct stu arr[5];
int i=0,j=0;
int n = sizeof(arr)/sizeof(arr[0]);
memset(arr,0,sizeof(arr));//整个数组 清0
//获取键盘输入
printf("请输入%d个学生信息\n",n);
for(i=0;i<n;i++)
{
scanf("%d %s %d",&arr[i].num, arr[i].name, &arr[i].age);
}
//根据学号 排序
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(arr[j].num < arr[j+1].num)//按照num的大小排序
{
struct stu tmp;
tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
//遍历
printf("---------------\n");
for(i=0;i<n;i++)
{
printf("%d %s %d\n",arr[i].num, arr[i].name,arr[i].age);
}
}
运行结果: