- 函数是什么
函数是子程序
- 函数的分类
1.库函数
可以提高开发效率
C语言常用库函数:
IO函数、字符串操作函数、字符操作函数、内存操作函数、时间/日期函数、数学函数、其他库函数
1.1字符串操作函数
1.1.1求字符串长度
strlen
size_t strlen(const char* str);
注意:
字符串以'\0'作为结束标志,strlen函数返回的字符串长度不包含结束标志
函数的返回值size_t是无符号的整型
模拟实现strlen函数,有以下三种方式
#include <stdio.h>
//1.计数器方式
int my_strlen1(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
//2.递归
int my_strlen2(const char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
return 1 + my_strlen2(str + 1);
}
}
//3.指针--指针的方式
int my_strlen3(const char* str)
{
char* p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
int main()
{
const char *str1 = "abcd";
my_strlen1(str1);
return 0;
}
1.1.2长度不受限制的字符串函数
(1)strcpy
char* strcpy(char* dest,const char* source);
作用:字符串的拷贝,将源字符串拷贝到目标空间
目标文件必须足够大、可变
模拟实现:
char* my_strcpy(char* dest, const char* source)
{
char*ret = dest;//让ret指向des
assert(dest != NULL);
assert(source!= NULL);
//先赋值,再往后走 ++优先级大于*
while ((*dest++ = *source++))
{
;
}
return ret;
}
(2)strcat
char* strcat(char* dest,const char* source);
作用:字符串的追加
目标文件必须可修改、足够大
strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:字符串不能自己给自己追加,'\0'会被覆盖,形成四循环
模拟实现:
char* my_strcat(char* dest,const char* source)
{
char* ret = dest;
assert(dest != NULL);
assert(source!= NULL);
while (*dest)
{
dest++;
}
//先赋值,再往后走 ++优先级大于*
while ((*dest++ = *source++))
{
;
}//dest指针已经走到了尾部,所以之前需要一个指针指向它的头部
return dest;
}
(3)strcmp
int strcmp(const char* str1,const char* str2);
作用:字符串的比较(比较的是ASCII码的值)
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "renhao is a actor";
char* str2 = "renhao is a doctor";
int ret=strcmp(str1, str2);
if (ret > 0)
{
printf("str1>srt2\n");
}
else if (ret == 0)
{
printf("str1=str2\n");
}
else
{
printf("str1<str2\n");//输出str1<str2
}
system("pause");
return 0;
}
1.1.3字符串查找
strstr
char* strstr(const char* haystack,const char* needle);
从字符串haystack中寻找needle第一次出现的位置,但是该函数不比较结束符NULL。
返回指向第一次出现needle位置的指针。
例题:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "This is a simple string";
char *str1;
str1 = strstr(str, "string");
if (str1!= NULL)
{
printf("%s ", str1);
}
return 0;
}
1.2内存操作函数
(1)memcpy内存拷贝
void* memcpy(void* destination,const void* source,size_t num);
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
该函数遇到'\0'的位置不会停下来
(2)memset
void* memset(void* ptr,int value,size_t num);
从ptr的位置开始将num个字节的值置为value(可以为0,清零)
#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "renhao is a actor";
char str2[100];
//将str1的内容拷贝到str2中
memcpy(str2, str1, strlen(str1)+1);
printf("%s\n", str2);
//将str2内容置为0
memset(str2, '0', strlen(str2));
printf("%s\n", str2);
system("pause");
return 0;
}
2.自定义函数
2.1概念:程序员自己设计的函数
2.2函数的组成
ret_type fun_name(paral,*)
{
statement;//语句项
}
ret_type:返回类型
fun_name:函数名
paral:函数参数
- 函数的参数
1.实参
2.形参
形参实例化相当于函数的一份临时拷贝,实参和形参使用的不是一块空间(传值时)
C语言中函数可以不写返回值,默认返回值是int
- 函数的调用
1.传值调用 函数的形参和实参分别占用不同的内存块,对形参的修改不会影响到实参
2.传址调用
- 函数的嵌套调用和链式访问
1.嵌套调用 在一个函数内部可以调用另外一个函数
2.链式访问:把一个函数的访问值作为另一个函数的参数
- 函数的声明和定义
1.先声明后定义
2.函数的定义是指函数的具体实现,交代函数的功能实现。
- 函数递归
递归算法的主要思想:把大事化小事
缺点:耗费时间
例题.接收一个整型值,按照顺序打印它的每一位。例如:输入1234,输出1 2 3 4
#include <stdio.h>
#include <string.h>
void Print(int n)
{
if (n > 9)
{
Print(n / 10);
}
printf("%d\n", n % 10);
}
int main()
{
int num =1234;
Print(num);
system("pause");
return 0;
}
【解析】