经常使用的字符串函数

一、strlen函数的使用和模拟实现

二、strcpy函数的使用和模拟实现

三、strncpy函数的使用和模拟实现

四、strcat函数的使用和模拟实现

五、strncat函数的使用和模拟实现

六、strcmp函数的使用和模拟实现

七、strncmp函数的使用和模拟实现

八、strstr函数的使用和模拟实现

前言

以下字符串函数基本上都在string.h头文件中,我们经常会遇见求字符串中字符个数、两个字符串进行比较、将某个字符串复制到另一个字符串中等一系列要求。如果我们不知道这些函数,那就要花时间创建,在创建时可能还要想怎么实现这样的功能。而对于已经掌握这些函数的程序员来说,就可以直接引用函数头文件,快速实现字符串的一系列操作。以下几个字符串函数都是在头文件string.h中。

strlen函数的使用和模拟实现

strlen函数被广泛用来求字符串长度,它不将字符串末尾的\0算进字符串长度,()中输入的是字符串的首地址,它从接收的地址开始计数,直到出现第一个所指的对象是‘\0’字符的地址。

2ebf2ea37f454718b91b736c5f3fb3c7.png

接下来就开始模拟strlen函数

1.计数器方式

13cf451c44ac42b7900162de5c5dbf0e.png

2.递归方式

141f4eb80119470783c1d59e7e27e7d5.png

错误使用方式:它从字符数组首地址逐渐向后找,若未找到'\0',它就会越界访问继续从s[4]='e'到越界访问s[5],然后报错。

e7aeaa3956b247b689d0587cbcd62e2d.png

strcpy函数的使用和模拟实现

strcpy(),()中有两个参数,列如strcpy(arr,arr1),这里arr和arr1都是字符串的首地址,它将arr1中的字符串复制到arr中,从它们所传递的地址处开始复制,会覆盖arr中最初的字母,当'\0'被赋给*s1时,就完成了循环。

#include<stdio.h>

void str_cpy(char* s1, char* s)

{

while (*s1++ = *s++);

}

int main()

{

char s[20] = "abcdef";

char s1[20] = { 0 };

str_cpy(s1, s);

printf("%s\n", s1);

return 0;

}

strncpy函数的使用和模拟实现

strncpy函数可以实现n个连续字符的复制

#include<stdio.h>
void str_ncpy(char* s, char* s1, int n)    //strncpy(s,s1,n)的参数为图所示
{
    while (n--)
    {
        *s++ = *s1++;
    }
}
int main()
{
    char s[10] = "okdefgh";
    char s1[10] = "abcdef";
    int n = 0;
    scanf("%d", &n);
    str_ncpy(s, s1, n);
    printf("%s\n", s);
    return 0;
}

strcat函数的使用和模拟实现

strcat函数是将两个字符串连接起来,实质上是将一个字符串复制到另一个字符串的末尾处(会将‘\0’覆盖)。注意的是,变长的字符串数组要注意空间大小,否则很容易溢出。

#include<stdio.h>
void str_cat(char* s, char* s1)
{
    while (*s != '\0')
    {
        s++;
    }
    while (*s = *s1)
    {
        s++;
        s1++;
    }
}
int main()
{
    char s[20] = "abcdef";
    char s1[20] = "ghikj";
    str_cat(s, s1);
    printf("%s\n", s);
    return 0;
}

都看到这了,各位小伙伴们思考一下:如果它连接自己会发生什么呢?(文章结尾处有答案)

strncat函数的使用和模拟实现

strncat函数多了参数n,它是将s1字符串n个连续的字符连接到s的末尾处(会将'\0'覆盖)。

#include<stdio.h>
void str_ncat(char* s, char* s1, int n)      //strncat的函数模拟实现就是如此
{
    while (*s)
    {
        s++;
    }
    while (n--)
    {
        *s++ = *s1++;
    }
}
int main()
{
    char s[20] = "abcdefgh";
    char s1[20] = "ijklmn";
    int n = 0;
    scanf("%d", &n);
    str_ncat(s, s1, n);
    printf("%s\n", s);
    return 0;
}

strcmp函数的使用和模拟实现

strcmp函数是将两个字符进行比较

#include<stdio.h>
int str_cmp(const char* a, const char* b)
{
    return *a - *b;
}
int main()
{
    char a = 'a';
    char b = 'b';
    int ret=str_cmp(&a, &b);
    if (ret)
        printf("a的值大于b\n");
    else
        printf("a的值小于b\n");
    return 0;
}

strcmp函数的使用和模拟实现

同理,strncmp是将n个连续的字符进行比较。若两个字符串前面n个字符都相等,它的返回值就为零,判为相等,否则就是不相等了

#include<stdio.h>
int  str_ncmp(char* c, char* c1, int n)
{
    while ((*c == *c1) && n--)    
    {
        c++;
        c1++;
    }
    return *c - *c1;
}
int main()
{
    char c[10] = "abcdefgh";
    char c1[10] = "abcdffgh";
    int n = 0;
    scanf("%d", &n);
    int ret = str_ncmp(c, c1, n);
    if (ret > 0)
        printf("c>c1\n");
    else if (ret < 0)
        printf("c<c1\n");
    else
        printf("c==c1\n");
    return 0;
}

strstr函数的使用和模拟实现

strstr函数的功能:在某字符串中是否有要被查找的字符串。如果有,则返回目标字符串的地址,否则,返回空指针。

#include<stdio.h>
char* str_str( char* arr,  char* read)
{
    char* a1 = arr;
    char* r1 = read;   
    if (!*read)        //确保要查找的字符串不为空
        return NULL;
    while (*arr!='\0')
    {
        a1 = arr;            //确保arr的指向不变,用a1进行判断,再通过该表达式使a1回到arr所指向的指针
        r1 = read;          //该表达式作用也是如此
        while (*a1 == *r1)
        {
            a1++;               //若有相同的字符,则继续找下一个。
            r1++;                
        }
        if (*r1 == '\0')            
            return arr;
        arr++;
    }
    return NULL;         //找不到,则返回空指针
}
int main()
{
    char arr[] = "abcdefghijkl";
    char read[] = "def";
    char* search=str_str(arr, read);
    printf("%s\n", search);
    return 0;
}       

strcat函数如果连接自己,就会使末尾的‘\0’被改变,从而一直连接,直到字符数组溢出。

各位亲们!看到这了,就给咱一个小红心咯,鼓励鼓励作者吧,离出数据结构和算法已经不远了,后面还会出扫雷以及贪吃蛇游戏,kmp算法不知各位亲们了解吗。关注我,带各位亲们学习更多好玩好用的知识。以后一两期,我会出有关strlen函数与sizeof操作符的比较,还有指针的讲述耶,这两样可不是各位亲们想象的那么简单嘞。除非你已经熟练掌握了c语言。

  • 60
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值