0
点赞
收藏
分享

微信扫一扫

功能多样的函数

大沈投资笔记 2022-01-20 阅读 91

目录

一、标准库函数

二、常见库函数使用

三、自定义函数

四、函数递归

五、字符串函数

六、内存函数


一、标准库函数

1.io函数:

printf(输出),scanf(输入)等等。

2.字符串操作函数:

strcpy(字符串拷贝)、strcmp(字符串比较)、strlen(字符串长度)、strcat(字符串连接)等等。

3.内存操作函数:

memset(内存设置)、memcpy(内存拷贝(不重叠))、memmove(内存拷贝(可以重叠))等等。

4.数学函数:

pow(求次方)、sqrt(开平方)等等。

二、常见库函数使用

1.strcpy

格式:strcpy(目标数组空间,原来数组空间),返回类型是char*

注意:\0也有被拷贝,如下图

 2.memset

格式:memset(要更改的数组空间,将更改的值,要改变的字节的数量),返回类型是void*

 

 3.pow

格式:double(底数,次数),返回类型是double

注意:调用库函数时,要包含对应的头文件

 三、自定义函数

1.传值调用

其中x是形参,n是实参

main函数上面的是函数的定义

使用函数时需先声明后使用

函数声明:,一般放在头文件中

 函数定义在main函数前时,函数可以不用声明,但是放在main后面时需要声明,因为编译器在查找代码时,是自上而下查找的

注意:函数声明比函数定义多了一个分号(;)

2.传址调用

当需要改变实参的值的时候,传值调用就不适用了,需要使用传址调用

因为函数传参调用时,形参是实参的一份临时拷贝,与实参所在的空间独立,所以改变形参的值,不影响实参

例图如下:px是接收&a的指针变量,py是接收&b的指针变量

3.嵌套调用和链式访问

嵌套调用:函数与函数之间的有机的组合,如下图:

链式访问:把一个函数的返回值作为另外一个函数的参数,如下图:

 注意:函数可以嵌套调用,但不能嵌套定义

四、函数递归

1.函数递归的两个必要条件:

存在限制条件

每次递归调用后,都越来越接近这个条件

递归展开图如下:

 2.什么时候适合用递归呢?

当解决一个问题递归和非递归都可以使用,且没有明显问题时,就能使用递归

当解决一个问题递归写起来简单,非递归较复杂,且递归没有明显问题时,那就用递归

如果用递归解决问题,写起来简单,但是有明显问题,则不能使用递归,得用非递归的方式来解决

五、字符串函数

注意:使用字符串函数必须包含头文件<string.h>

strlen(字符串长度)

 "abcdef"中的末尾有一个\0,求它的长度时,不包括\0,\0是字符串结束的标志

如下图,数组中不包含\0,所以所求的字符串长度是随机值

 

循环计数法模拟实现

 assert是断言,遇到空指针传参时,会报错,便于调试找错

 注意:strlen的返回类型是无符号整数类型(size_t)

            参数指向的字符串必须要以'\0'结束

strcpy(字符串拷贝)

模拟实现

注意: 源字符串必须以'\0'结束

            会将源字符串中的'\0'拷贝到目标空间

            目标空间必须足够大,才能保证能够存放源字符串

            目标空间必须可变(不能加const,char* dest = "xxxxxx"也不可以)

strcat(字符串连接)

 strcat是把源字符串的\0,拷贝到目标空间,目标空间之前的\0,被覆盖了

模拟实现

注意:  源字符串必须以'\0'结束。

          目标空间必须有足够的大,能容纳下源字符串的内容。

          目标空间必须可修改。

 strcmp(字符串比较)

 从左向右比较,比较的是字符的ASCII码值,而不是字符串长度

 大于或者小于时,返回的具体值是不确定的

 第一个字符串大于第二个字符串,则返回大于0的数字

 第一个字符串等于第二个字符串,则返回0

 第一个字符串小于第二个字符串,则返回小于0的数字

模拟实现

 由于strcmp、strcpy、strcmp不安全,所以又有了strncmp、strncpy、strncpy三个函数,限制了字符串长度

strncpy

 strncat

 strcmp

strstr(字符串查找) 

 如果后面还有与子字符串相同的,还是会从第一个与子字符串相同的字母开始打印

模拟实现

 

模拟实现时,2种情形都必须考虑到

 

 strtok(字符串分隔)

 该函数不是常用字符串函数,只需大概了解,以及简单的使用即可

strerror

可以返回C语言内置的错误码所对应的错误信息

内存函数 

使用内存函数必须包含<memory.h> or <string.h>

memcmp(内存比较)memcpy(内存拷贝,不重叠)、memmove(内存拷贝,重叠与不重叠均可)、memset(内存设置)

memmove比memcpy功能更强大一些

memcpy(内存拷贝,不重叠)

注意:拷贝的数量是字节,而不是元素个数

模拟实现

void*是万能指针类型,能接收int*、char*等指针类型数据的传参

缺陷:不能参与运算,如+-*/,也不能对其直接解引用,除非强制类型转换 

memmove(内存拷贝,重叠与不重叠均可)

 注意:拷贝的数量是字节,而不是元素个数

模拟实现

 

 memcmp(内存比较)

注意:是一对字节依次比较的,不是元素 

举报

相关推荐

0 条评论