目录
函数分为库函数和自定义函数。在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序开发。
C语言有许多库,每个库包含许多库函数。
常见的内存操作函数:
memcpy:用于将一块内存的内容复制到另一块内存中。 函数原型:void *memcpy(void *dest, const void *src, size_t n) 参数说明:
- dest:目标内存的指针,指向要复制到的内存区域。
- src:源内存的指针,指向要复制的内存区域。
- n:要复制的字节数。
memset:用于将一块内存的内容设置为指定的值。 函数原型:void *memset(void *s, int c, size_t n) 参数说明:
- s:要设置的内存的指针,指向要设置的内存区域。
- c:要设置的值,以字符形式表示。
- n:要设置的字节数。
memmove:用于将一块内存的内容移动到另一块内存中,可以处理内存重叠的情况。 函数原型:void *memmove(void *dest, const void *src, size_t n) 参数说明:
- dest:目标内存的指针,指向要移动到的内存区域。
- src:源内存的指针,指向要移动的内存区域。
- n:要移动的字节数。
memcmp:用于比较两块内存的内容是否相等。 函数原型:int memcmp(const void *s1, const void *s2, size_t n) 参数说明:
- s1:第一块内存的指针。
- s2:第二块内存的指针。
- n:要比较的字节数。
memchr:用于在一块内存中搜索指定的字符。 函数原型:void *memchr(const void *s, int c, size_t n) 参数说明:
- s:要搜索的内存的指针。
- c:要搜索的字符。
- n:要搜索的字节数。
常用的IO函数包括:
printf:用于输出格式化的数据到标准输出设备(通常是屏幕),语法为:
printf("格式控制字符串", 参数列表);
scanf:用于从标准输入设备(通常是键盘)读取格式化的数据,语法为:
scanf("格式控制字符串", 参数列表);
getchar:用于从标准输入设备读取一个字符,语法为:
int getchar(void);
putchar:用于向标准输出设备输出一个字符,语法为:
int putchar(int c);
gets:用于从标准输入设备读取一行字符,语法为:
char *gets(char *str);
puts:用于向标准输出设备输出一行字符,语法为:
int puts(const char *str);
fprintf:用于将格式化的数据输出到指定的文件中,语法为:
int fprintf(FILE *stream, "格式控制字符串", 参数列表);
fscanf:用于从指定的文件中读取格式化的数据,语法为:
int fscanf(FILE *stream, "格式控制字符串", 参数列表);
fgets:用于从指定的文件中读取一行字符,语法为:
char *fgets(char *str, int n, FILE *stream);
fputs:用于向指定的文件输出一行字符,语法为:
int fputs(const char *str, FILE *stream);
字符串操作函数:
- strlen(s):返回字符串s的长度(不包括结束符'\0')。
- strcpy(dest, src):将字符串src复制到dest中。
- strncpy(dest, src, n):将字符串src的前n个字符复制到dest中。
- strcat(dest, src):将字符串src连接到dest的末尾。
- strncat(dest, src, n):将字符串src的前n个字符连接到dest的末尾。
- strcmp(s1, s2):比较字符串s1和s2,返回一个整数,表示两个字符串的大小关系。
- strncmp(s1, s2, n):比较字符串s1和s2的前n个字符,返回一个整数,表示两个字符串的大小关系。
- strchr(s, c):在字符串s中查找字符c的第一次出现的位置,返回一个指向该位置的指针。
- strrchr(s, c):在字符串s中查找字符c的最后一次出现的位置,返回一个指向该位置的指针。
- strstr(s1, s2):在字符串s1中查找字符串s2的第一次出现的位置,返回一个指向该位置的指针。
字符操作函数:
- isalpha(c):判断字符c是否为字母。
- isdigit(c):判断字符c是否为数字。
- isalnum(c):判断字符c是否为字母或数字。
- isspace(c):判断字符c是否为空白字符(空格、制表符、换行符等)。
- toupper(c):将字符c转换为大写字母。
- tolower(c):将字符c转换为小写字母。
一.函数的组成
ret_type fun_name(para1, * )
{
statement;//语句项
}
#include <stdio.h>
//方式一不能完成任务
void Swap1(int x, int y) {
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
//方式二才能实现
void Swap2(int *px, int *py) {
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
1.实际参数(实参):
2.形式参数(形参):
形参是实参的拷贝,在调用函数的地方传入的实参,而实际在函数执行代码的形参
二.函数的调用
1.传值调用
2.传址调用
3.函数的嵌套调用和链式访问
嵌套调用:
#include <stdio.h>
void new_line() // 函数一
{
printf("hehe\n");
}
void three_line() // 函数二
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
}
}
链式访问
三.函数的声明和定义
1.函数的声明:
2.函数的定义:
四.函数的递归和迭代
1.函数的递归
#include<stdio.h>
void print(int n) {
if (n) {
print(n / 10);
printf("%d ", n % 10);
}
}
递归实现求字符串长度函数:
2.函数的迭代
//函数的递归实现
int fun1(int n){
if(n==1)return 1;
else
return n*fun1(n-1)
}
//函数的迭代实现
int fun2(int n){
int ret,i;
for(i=1;i<=n;i++){
ret=ret*i;
}
return ret;
}
3.用函数递归解决经典问题
(1)汉诺塔问题
由分析可得,步骤一和三递归实现即可。
总次数=将n-1个盘移到B杆 + 将第n盘移到C杆 + 将n-1个盘移到C杆
//实现求出需要移动圆盘总次数的函数
int fun(int n){
if(n==1) return 1;
else
return 2*fun(n-1)+1;
}
(2)青蛙跳台阶问题
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
列出函数表达式:(与斐波那契数列类似)
int fun(int n){
if(n==1)return 1;
if(n==2)return 2;
if(n>2) return fun(n-1)+fun(n-2);
}