C语言总结2---函数

  • 函数是什么

函数是子程序

  • 函数的分类

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;
}

【解析】

猜你喜欢

转载自blog.csdn.net/weixin_43807876/article/details/114710293