递归函数 字符串处理函数库 数学库

本文深入探讨了递归函数的概念,并详细介绍了C语言中的字符串处理函数库,包括strcpy、strncpy、strcat、strcmp、strncmp、sprintf、sscanf以及strstr等。此外,还讲解了数学库中的sqrt和pow函数,为程序员提供了实用的操作指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归函数

  • 本质:自己调用自己
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值