C语言-Day10

作业

1.自定义函数(my_strlen)实现strlen函数的功能

#include <stdio.h>
#define M 100
//定义函数实现strlen的功能
void my_strlen(const char *str)
{
	int len=0;	//定义长度变量
	while(*str++)            //遍历数组
	{
			len++;               
	}
	printf("字符串的长度是:%d\n",len);
}
/***************主函数******************/
int main(int argc, const char *argv[])
{	
	char arr[M]="";
	printf("请输入字符串:\n");
	gets(arr);
	my_strlen(arr);

	return 0;
}

2.自定义函数(my_strcpy)实现strcpy函数的功能:

#include <stdio.h>
#define M 100
//定义函数实现strcpy功能
void my_strcpy(char *arr,const char *brr)
{
	while(*brr!='\0')               //被复制的指针到\0时停止
	{
		*arr++=*brr++;
		
	}
	*arr='\0';             //添加结束标示
	
}

/**********************主函数*********************/
int main(int argc, const char *argv[])
{
	char arr[M]="";
	char brr[M]="hollow knight";
	my_strcpy(arr,brr);
	printf("复制后的字符串为:%s\n",arr);
	return 0;
}

3.自定义函数(my_strcmp)实现strcmo函数的功能

#include <stdio.h>
#define M 100

//定义函数my_strcmp
int my_strcmp(const char *arr,const char *brr)
{
	while((*arr==*brr)&&(*arr!='\0'))
	{
		arr++;
		brr++;
	}	return *arr-*brr;
		
	
}


/******************************主函数**************************/
int main(int argc, const char *argv[])
{
	char arr[M]="";
	char brr[M]="";
	printf("请输入第一个字符串:");
	scanf("%s",arr);
	printf("请输入第二个字符串:");
	scanf("%s",brr);
	int res=my_strcmp(arr,brr);
	if (res>0)
	{
		printf("前者大\n");
	}
	else if(res==0)
	{
		printf("一样大\n");
	}
	else
	{
		printf("后者大\n");
	}
	return 0;
}

4.自定义函数(my_strcat)实现strcat函数的功能

#include <stdio.h>
#define M 100
//定义函数

void my_strcat(char *q,const char*p)
{
	for(int i=0;*q!='\0';i++)
	{
		q++;
	}
	while(*p!='\0')
	{
		*q++=*p++;
	}
	*q='\0';

}

/********************主函数*********************/
int main(int argc, const char *argv[])
{	
	char q[M]="";
	char p[M]="";
	printf("请输入第一个字符串:");
	gets(q);
	printf("请输入第二个字符串:");
	gets(p);
	my_strcat(q,p);
	printf("连接后的字符串:%s\n",q);
	return 0;
}


5.自定义函数(my_strstr)实现求src字符串中是否包含子串dest字符串

#include <stdio.h>
#include<string.h>
int my_strstr(const char *a,const char*b)
{
	int i=0,j=0;
	for(i;*a!='\0';i++)
	{
		if(a[i]==b[0])//找到第一个相同的
      {
     	for(j;*b!='\0';j++)
		{
     		if (a[i+j] != b[j])
			{
     			break;
		 	}
	 	}if(j==strlen(b))//检验是否完全等于b串;
    	{
		 return 1;
	 	}
	 }
	}return 0;
}


/*****************主函数*********************/
int main(int argc, const char *argv[])
{
	char src[]={"abcdefg"};
	char dest[]={"def"};
	int res=my_strstr(src,dest);
	if(res==1){printf("包含\n");}
	else{printf("不包含\n");
		}
	
	return 0;
}

今日笔记:

一 、指针指向数组

1.1 指针与数组的关系

1>一堆数组的数组名,本质上是一个该数组第一个元素的地址

        int arr[5];                        arr<==>&arr[0]

2>数组名是一个地址常量,不能被重新赋值,但是数组名可以偏移
3>二维数组的数组名,从数值上来说也是一个该数组第一个元素的地址

int arr[3][4];  arr<==>&arr[0]        arr[0]<==>&arr[0][0]  arr[i]<==>&arr[1][0]

1.2 指针与一维数组关系的实现

1>指针与一维数组的关系
#include<myhead.h>
 
int main(int argc, const char *argv[])
{
	//定义一个一维数组
	int arr[] = {3,8,3,2,4};
	int len = sizeof(arr)/sizeof(arr[0]);    //求数组长度
 
	//定义指针指向一维数组
	int *ptr = arr;             //int *ptr = &arr[0];
 
	//数据输出方式1,从值的角度
	printf("数据元素分别是:");
	for(int i=0; i<len; i++)
	{
		printf("%d\t", arr[i]);
	}
	printf("\n");
 
	//输出方式2:从数组名的角度
	printf("数据元素分别是:");
	for(int i=0; i<len; i++)
	{
		printf("%d\t", *(arr+i) );
	}
	printf("\n");
 
	//输出方式3:从指针变量的角度
	printf("数据元素分别是:");
	for(int i=0; i<len; i++)
	{
		printf("%d\t", *(ptr+i) );
	}
	printf("\n");
 
	//输出方式4:从指针的角度找值
	printf("数据元素分别是:");
	for(int i=0; i<len; i++)
	{
		printf("%d\t", ptr[i]);
	}
	printf("\n");
 
	//输出方式5:从指针变量的角度
	printf("数据元素分别是:");
	for(int i=0; i<len; i++)
	{
		printf("%d\t", *(ptr++));
		
	}
	printf("\n");
 
	return 0;
}
 
2>指针指向一维整型数组作为函数参数传递

        当实参使用的是数组名进行传递时,本质上传递的是数组首元素的地址

        被调函数的形参可以是一个数组接收,也可以是一个指针变量接收

        虽然使用的是数组接受,但是,本质上也还是使用的是指针接收

#include<myhead.h>
 
//使用数组接受
/*
void sort(int arr[], int n)
{
	for(int i=1; i<n; i++)
	{
		for(int j=0; j<n-i; j++)
		{
			if(arr[j] > arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
	printf("排序成功\n");
}
*/
 
//使用指针接受
void sort(int *arr, int n)
{
	for(int i=1; i<n; i++)
	{
		for(int j=0; j<n-i; j++)
		{
			if(arr[j] > arr[j+1])   //if(*(arr+j) > *(arr+j+1))
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
	printf("排序成功\n");
}
 
 
 
 
 
 
 
 
 
/***************************主程序**********************/
int main(int argc, const char *argv[])
{
	int arr[5] = {3,9,2,7,6};
 
	//调用排序函数,将数组进行排序
	sort(arr, 5);     //sort(&arr[0], 5)
 
	printf("排序后的结果为:");
	for(int i=0; i<5; i++)
	{
		printf("%d\t", arr[i]);
	}
	printf("\n");
 
	return 0;
}
 
3>指针指向一维字符数组作为函数参数传递
1、由于字符串有结束标识,所以接受字符串的时候,可以不用接收字符串长度
2、一般对传入的字符串如果不进行更改操作的话,需要加上关键字const修饰
3、指针与字符串的关系

        字符串本质上是一个指针常量,可以定义一个指针指向一个字符串

        当一个指针指向一个字符串的时候,不能通过该指针改变字符串中的内容

4>关于关键字const

        1.const中文含义,常量,常属性

        2.该关键字是一个变量的存储格式,修饰变量时,表示给该变量添加常属性

        3.const修饰的变量,虽然有常属性,但是依然时变量

        4.定义变量的格式 const数据类型 变量名;

        5.修饰变量时,包括修饰普通变量和指针变量,有所不同

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
	int num = 520;       //定义的是普通变量
	const int key ;   //定义的是常变量
 
	//常变量跟普通变量一样,可以被访问
	printf("num = %d, key = %d\n", num, key);
 
	num = 999;
	//key = 666;   //不能直接通过key对key的值进行修改
	int *ptr = &key;
	*ptr = 666;
	printf("num = %d, key = %d\n", num, key);
 
	return 0;
}
 
6>const 修饰指针变量

定义指针变量的格式:数据类型 *指针名;

#include<myhead.h>
 
int main(int argc, const char *argv[])
{
	int num = 520;
	int key = 1314;
 
	//定义指针变量指向普通变量
	const int *p1 = &num;    //p1保护的是指针指向内存空间中的值
	int const *p2 = &num;    //与p1一样
	int * const p3 = &num;   //p3保护的是指针中的值
	const int * const p4 = &num; //两个都保护
 
	//验证p1保护哪个内容
	//*p1 = 999;           //更改指针指向内存空间中的值,报错
	//p1 = &key;           //更改指针的值
	
	//验证p2保护哪个内容
	//*p2 = 999;           //更改指针指向内存空间中的值,报错
	// p2 = &key;           //更改指针的值
 
	//验证p3保护哪个内容
	//*p3 = 999;           //更改指针指向内存空间中的值,报错
	// p3 = &key;           //更改指针的值
 
	//验证p4保护哪个内容
	*p4 = 999;           //更改指针指向内存空间中的值,报错
	p4 = &key;           //更改指针的值
 
 
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值