目录
一、标准库函数
二、常见库函数使用
三、自定义函数
四、函数递归
五、字符串函数
六、内存函数
一、标准库函数
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(内存比较)
注意:是一对字节依次比较的,不是元素