递归函数
- 本质:自己调用自己
#include<stdio.h>
int add(int num);
int main()
{
printf("Sum = %d\n",add(3));
return 0;
}
//小例子:求1-100的和,使用递归函数做
/*****************************
* 函数名:int add(int num)
* 函数功能:求1-100的和,使用递归函数做
* 参数:
* num:要累计到的最大的值
* 返回值:累计的和
* ****************************/
int add(int num)
{
if(num == 1)
{
return 1;
}
return num + add(num-1);
}
字符串处理函数库
#include <string.h>
strcpy函数
#include <stdio.h>
#include <string.h>
/*******************************************************
头文件:#include <string.h>
函数名:char *strcpy(char *dest, const char *src);
功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
参数:
dest:目的字符串首地址
src:源字符首地址
返回值:
成功:返回dest字符串的首地址
失败:NULL
注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
*********************************************************/
int main()
{
//数组名不可以直接赋值,可以赋值的地方只有定义时初始化的时候
//所以我们只能使用内部元素赋值,访问内部元素最好的方式是循环变量
//而我们的string库里面的方法就是使用循环操作
char str_1[1024] = "hello world";
char str_2[1024] = "12341251343415234";
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
#if 0 //手动循环拷贝
for(int i = 0; i <= strlen(str_1);i++)
{
str_2[i] = str_1[i];
}
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
#endif
#if 1 //调用系统库的strcpy拷贝
strcpy(str_2,str_1);
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
#endif
#if 0 //调用自己写的的smy_trcpy拷贝
char *my_strcpy(char *dest, const char *src);
my_strcpy(str_2,str_1);
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
#endif
return 0;
}
/*************能*****************************
函数名:char *my_strcpy(char *dest, const char *src)
功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
参数:
dest:目的字符串首地址 //dest没有被const修饰,所以dest的指针和地址对应的内存单元都可以被修改
src:源字符首地址 //src被const修改,原型cosnt *src,所以指针没有被修改,所以他可以更改指向,但是对应内存但愿被修饰,所以
//对应内存单元不可以被修改
返回值:
成功:返回dest字符串的首地址
失败:NULL
注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
*********************************************************/
char *my_strcpy(char *dest, const char *src)
{
for(int i = 0; i <= strlen(src);i++)
{
dest[i] = src[i];
}
return dest;
}
strncpy函数
#include <stdio.h>
#include <string.h>
//strncpy是我们的strcpy的升级版
/**********************************
函数名:char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
功能:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'。
参数:
dest:目的字符串首地址
src:源字符首地址
n:指定需要拷贝字符串个数
返回值:
成功:返回dest字符串的首地址
失败:NULL
* ********************************/
int main()
{
char str_1[1024] = "hello world";
char str_2[1024] = "12sadfasdfasdfasdfasdf3";
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
strncpy(str_2,str_1,12);
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
return 0;
}
strcat函数
#include <stdio.h>
//字符串追加:strcat
/************************************
头文件:#include <string.h>
函数名:char *strcat(char *dest, const char *src);
功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
参数:
dest:目的字符串首地址
src:源字符首地址
返回值:
成功:返回dest字符串的首地址
失败:NULL
************************************/
#include <string.h>
int main()
{
char str_1[1024] = "hello world";
char str_2[1024] = "12sadf0123123sdfasdfasdfasdf3";
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
#if 0
strcat(str_2,str_1);
//12sadfasdfasdfasdfasdf3hello world
#else
//调用自己写的追加函数
char *my_strcat(char *dest, const char *src);
my_strcat(str_2,str_1);
#endif
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
return 0;
}
/************************************
函数名:char *my_strcat(char *dest, const char *src);
功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
参数:
dest:目的字符串首地址
src:源字符首地址
返回值:
成功:返回dest字符串的首地址
失败:NULL
************************************/
char *my_strcat(char *dest, const char *src)
{
char *head = dest;
while(*dest) // '\0' == 0 == NULL | 0 ,000,0x00
{
dest++;
}
for(int i = 0 ; i <= strlen(src);i++)
{
dest[i] = src[i];
}
return head;
}
strcmp与ctrncmp函数
#include <stdio.h>
/**************************************************
#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较 s1 和 s2 的大小,比较的是字符ASCII码大小。完全比较
参数:
s1:字符串1首地址
s2:字符串2首地址
返回值:
相等:0
大于:>0 在不同操作系统strcmp结果会不同 返回ASCII差值
小于:<0
****************************************************/
//经常用于判断两个字符串是否相等
/**************************************************
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
功能:比较 s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小。
参数:
s1:字符串1首地址
s2:字符串2首地址
n:指定比较字符串的数量
返回值:
相等:0
大于: > 0
小于: < 0
****************************************************/
#include <string.h>
int main()
{
char str_1[1024] = "hello world";
char str_2[1024] = "hello1worl";
printf("str_1 = %s\n",str_1);
printf("str_2 = %s\n",str_2);
#if 0 //全部比较
if(strcmp(str_1,str_2) == 0)
{
printf("str_1 == str_2\n");
}
else{
printf("str_1 != str_2\n");
}
#else //前n个部分比较
if(strncmp(str_1,str_2,5) == 0)
{
printf("str_1 == str_2\n");
}
else{
printf("str_1 != str_2\n");
}
#endif
return 0;
}
sprintf与sscanf函数
#include <stdio.h>
/**************************************
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 '\0' 为止。
参数:
str:字符串首地址
format:字符串格式,用法和printf()一样
返回值:
成功:实际格式化的字符个数
失败: - 1
* **************************************/
/**************************************
#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
参数:
str:指定的字符串首地址
format:字符串格式,用法和scanf()一样
返回值:
成功:参数数目,成功转换的值的个数
失败: - 1
* **************************************/
int main()
{
char str_name[] = "张三";
int m_age = 18;
int m_height = 165;
char buf[1024]="";
sprintf(buf,"姓名:%s 年龄:%d岁 身高:%dcm",str_name,m_age,m_height);
printf("%s\n",buf);
char str_name1[1024] = "李四";
int m_age1 = 50;
int m_height1 = 170;
//sscanf(buf,"姓名:%s 年龄:%d岁 身高:%dcm",str_name1,&m_age1,&m_height1);
sscanf(buf,"姓名:%s 年龄:%d岁 身高:%d",str_name1,&m_age1,&m_height1);
printf("姓名:%s 年龄:%d岁 身高:%dcm\n",str_name1,m_age1,m_height1);
return 0;
}
strstr函数
#include <stdio.h>
/************************
#include <string.h>
char *strstr(const char *haystack, const char *needle);
功能:在字符串haystack中查找字符串needle出现的位置
参数:
haystack:源字符串首地址
needle:匹配字符串首地址
返回值:
成功:返回第一次出现的needle地址
失败:NULL
***************************/
#include <string.h>
int main()
{
char str_name1[] = "1234567890";
char str_str[] = "3";
char *temp = strstr(str_name1,str_str); //如果成功返回出现在源串中的地址
if(NULL == temp)
{
printf("没有找到\n");
}
else{
*temp = '\0';
printf("找到了:%s\n",str_name1);
}
return 0;
}
atoi、atof和atol函数
#include <stdio.h>
//atoi:string -> int
//atol:string -> long
//atof:string -> float
/*******************************
#include <stdlib.h>
int atoi(const char *nptr);
功能:atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。
参数:
nptr:待转换的字符串
返回值:成功转换后整数
类似的函数有:
atof():把一个小数形式的字符串转化为一个浮点数。
double atof(const char *nptr);
atol():将一个字符串转化为long类型
long atol(const char *nptr);
****************************************/
#include <stdlib.h>
int main()
{
//int num = atoi(" -123四大和发动机"); //num = -123
int num = atoi(" 123.21四大和发动机"); //num = +123
long num_long = atol(" 123.12四大和发动机");
double num_double = atof(" 123.12四大和发动机");
printf("num = %+d\n",num);
printf("num_long = %+ld\n",num_long);
printf("num_double = %f\n",num_double);
return 0;
}
数学库
sqrt和pow函数
/*****************************************
头文件:#include <math.h>
函数名:double sqrt(double x)
功能:C 库函数 double sqrt(double x) 返回 x 的平方根。
参数:x -- 浮点值。
返回值:该函数返回 x 的平方根
*****************************************/
//使用数学库需要加 -lm 编译
/*****************************************
函数名:double pow(double x, double y)
功能:C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 xy。
参数:
x -- 代表基数的浮点值。
y -- 代表指数的浮点值。
返回值:该函数返回 x 的 y 次幂的结果。
*****************************************/
#include <stdio.h>
#include <math.h>
int main()
{
int num_int = 16;
double num = sqrt(16); //开根
printf("num = %f\n",num);
printf("幂的值:%f\n",pow(2,8));
return 0;
}