c语言函数

首先我们要知道什么是函数,有一个定义是能完成模块化的功能的作用叫做函数。在C语言中常见的函数有io输入输出函数,字符操作函数,字符串操作函数,时间/日期函数,数学函数,其他库函数等等。

在这里推荐一个网站叫做ccplus.com在里面我们可以找到C语言所有的库函数,并且含有使用方法和简介,大家要试着会读这些网站里面的函数。

下面我给大家介绍几个库函数:

1.strcpy()---string  copy 函数,即字符串拷贝函数,它包含在string.h>头文件,我们在ccplus网站可以看到他是这样的char*strcpy(char *destination,const char*source);即把source复制到destination中,需要注意的是会连同\0一起复制过去。

下面看代码实例:

#include<stdio.h>
#include<string.h>
int main(){
char arr1[]="bit";
char arr2[20]="########";
strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;}

代码运行结果是bit。

2.memset--memory set(内存设置函数)

使用方法:

int main(){
char arr[]="hello world";
memset(arr,'*',5);//第一个是需要替换的地址,第二个是替换的内容,第三个是替换的个数
printf("%s\n"arr);

当然C语言最重要的还是自定义函数,也就是程序员自己为了想要实现某个功能而写的函数。

程序员想要设立一个自定义函数需要设立函数名,函数参数,和返回类型。

下面我们来看一个实现加法的自定义函数代码:

#include<stdio.h>
int add(int x,int y){
int z=0;
z=x+y;
return z;}
int main(){
int a=10;
int b=10;
int sum=add(a,b);
printf("%d\n",sum);
return 0;}

下面我们来看这样一串代码:

#include<stdio.h>
int get_max(int x,int y){
if(x>y)
return x;
else
return y;}
int main(){
int a=20;
int b=10;
int max=get_max(a,b);
printf("max=%d\n",max);
return 0;}

这是一个比较两个数大小的函数,结果是20。

我们再来看这样一串代码:

#include<stdio.h>
void swap(int x,int y){
int tmp=0;
tmp=x;
x=y;
y=tmp;}
int main(){
int a=10;
int b=20;
printf("a=%d  b=%d\n",a,b);
swap(a,b);
printf("a=%d b=%d\n",a,b);
return 0;}

可以看出编写这段代码的人是希望交换a,b,两个数的,但是最后代码的运行结果却不尽如意。那么是哪里出现问题了呢?在这里我们要介绍实参和形参,在这个代码里面实参就是a和b,形参就是swap函数定义的x和y。我们在用swap函数的时候把a,b这样两个实参传递给了x和y这样两个形式参数,所以说形参就是实参的一份临时拷贝,只有在调用函数的时候才会为形参开辟一片空间,在执行完函数的时候就会释放,所以在swap函数里面,x和·y虽然暂时有了ab的值,但是在swap函数中对形参x和y的改变是不会影响实参ab的值的,所以说最后ab的值没有交换,这就是我们在函数中常说到的值传递。

下面看这样一串代码就解决了这样的一个问题:

#include<stdio.h>
void swap(int *pa,int *pb){
int tmp=0;
tmp=*pa;
*pa=*pb;
*pb=tmp;}
int main(){
int a=10;
int b=20;
printf("a=%d b=%d\n",a,b);
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;}

这样是把ab的地址传给了形参,所以可以直接改变ab。

在上面我们可以知道函数的调用有两种:一种是传值调用(函数的形参和实参分别占用不同的内存块,形参的改变不会影响实参的值);还有一种是传址调用(是把函数创建变量的内存地址传递给函数参数的一种调用函数的方式,这种方式可以让函数与函数外部建立起真正的联系。)

下面我们来进行几个用函数实现问题的联系:

1.写一个函数判断是否素数

#include<stdio.h>
#include<math.h>
int is_prime(int n){
int j=0;
for(j=2;j<=sqrt(n);j++){
if(n%j==0)
return 0;}
else
return 1;}
int main(){
int i=0;
for(i=100;i<=200;i++){
if(is_prime(i)==1)
printf("%d ",i);}}

2.写一个函数判断是否闰年

#include<stdio.h>
int is_leap_year(int y){
if((y%4==0&& y%100!=0)||(y%400==0))
return 1;
else 
return 0;}
int main(){
int year=0;
for(year=1000;year<=2000;year++){
if(is_leap_year(year)==1){
printf("%d",year);}}
return 0;}

3.写一个函数实现一个整型有序数组的二分查找:

功能实现:在一个有序数组中查找某个具体的数。如果找到了返回下标,找不到的化返回-1,通过对被查找元素的左右下标确定中间下标,当left和right交错的时候不可查找。

代码端:

#include<stdio.h>
int binary_searchh(int arr[],int k,int sz){
int left=0;
int right=sz-1;
while(left<=right){
int mid=(left+right)/2;//中间元素的下标
if(arr[mid]<k){
left=mid+1;
}
else if(arr[mid]>k){
right=mid-1;}
else{
return mid;
}}
return -1;}
int main(){
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k=7;
int sz=sizeof(arr)/sizeof(arr[0]);
int ret=binary_search(arr,k,sz);
if(ret==-1){
printf("找不到指定的数字\n"):
else{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}

写这个代码需要注意的地方就是用sizeof计算长度的时候要放在主函数中,因为如果放在自定义函数中的话,本质上是传递的arr数组首元素的地址,而不是数组整体,所以形参的arr是一个指针,当计算sizeof(arr)的时候就是4。还有就是要注意while循环里面的条件是需要等于的。求中间元素下标的语句需要放到循环里面。既要处理找到的情况也要处理没找到的情况。

函数的嵌套和链式访问:

函数嵌套就是说函数和函数之间是可以有机组合的

链式访问是指可以把一个函数的返回值作为另一个函数的参数。

即int len=0; len=strlen("abc"); printf("%d\n",len);等价于printf("%d\n",strlen(abc));

这里的printf函数和strlen函数就嵌套使用了

还有这样一个语句:printf("%d",printf("%d",printf("%d",43)));

最后打印的结果是4321,因为printf函数的返回值是所打印字符的个数。

函数的声明和定义:

就是说如果函数是在主函数后面定义的话,需要现在前面进行声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值