【C】字符串库函数及其模拟实现(中)—— strncpy | strncat | strncmp

简介: strncpy | strncat | strncmp

正文开始@边通书

:apple:上篇文章介绍了没有长度限制的几个字符串库函数 strcpy, strcat, strcmp,它们就是上来就是干,直至\0为止,是不太安全的。
本文将继续介绍相对安全的几个有长度限制的字符串库函 strncpy, strncat, strncmp及其 模拟实现

这些模拟实现都是我凭借:snowflake:颤抖直觉:snowflake:写出来的,当然不完美,同时也可以去参考一下标准库函数,小边看的时候真是大喊妙绝,但对于新手不建议追求奇淫技巧,以逻辑和可读性为主。

4.strncpy

在这里插入图片描述
想要很好的模拟实现原逻辑,要先充分了解函数的脾气。
在这里插入图片描述

:innocent: strncpy的模拟实现--- my_strncpy
#include<stdio.h>
#include<assert.h>

char* my_strncpy(char* dest, const char* src, size_t count)
{
    assert(dest&&src);//断言--保证指针有效性     
    size_t i = 0;
    char* ret = dest;
    for (i = 0; i < count; i++)
    {
        *(dest + i) = *(src + i);//拷贝
        //若count>字符串内容
        if (*(src + i) == '\0')
        {
            for (i += 1; i < count; i++)
            {
                *(dest + i) = 0;
            }
        }
    }
    return ret;
}
int main()
{
    char arr1[] = "abcdefghi";
    char arr2[] = "xxxx";
    char* ret = my_strncpy(arr1, arr2, 6);
    printf("%s\n", ret);
    return 0;
}

运行结果:
在这里插入图片描述
标准库函数:
在这里插入图片描述

5.strncat

在这里插入图片描述

想要很好的模拟实现原逻辑,要先充分了解函数的脾气。
在这里插入图片描述

:innocent: strncat的模拟实现--- my_strncat
#include<stdio.h>
#include<assert.h>

char* my_strncat(char* dest, const char* src, size_t num)
{
    assert(dest&&src);
    size_t i = 0;
    char* ret = dest;
    //1.找到\0位置
    while (*dest)
    {
        dest++;
    }
    //2.追加
    for (i = 0; i < num; i++)
    {
        if (*(src + i) == '\0')
        {
            break;
        }
        *(dest + i) = *(src + i);
    }
    *(dest + i) = '\0';//主动添加\0
    return ret;
}

int main()
{
    char arr1[] = "abc\0xxxxxxxxxx";
    char arr2[] = "def";
    my_strncat(arr1, arr2, 6);
    return 0;
}

运行结果:
在这里插入图片描述
参考标准库函数:
在这里插入图片描述

6.strncmp

在这里插入图片描述
想要很好的模拟实现原逻辑,要先充分了解函数的脾气。
在这里插入图片描述

:innocent: strncmp的模拟实现--- my_strncmp
#include<stdio.h>
#include<assert.h>

int strncmp(const char* str1, const char* str2, size_t num)
{
    assert(str1&&str2);
    size_t i = 0;
    while (*str1 == *str2)//字符相同
    {
        i++;
        //若遇到\0或已到num仍相同,则返回0
        if ((*str1 == '\0') ||(i==num) )
        {
            return 0;
        }
        str1++;
        str2++;
    }
    //若字符不同,则返回差值
    return *str1 - *str2;
}
int main()
{
    char arr1[] = "abcwef";
    char arr2[] = "ab";
    int ret = strncmp(arr1, arr2, 3);
    printf("%d\n", ret);
    return 0;
}

运行结果:
在这里插入图片描述

未完待续

:star:下篇文章将继续介绍 strstr, strtok, strerrot这些字符串库函数以及 字符操作
相关文章
|
NoSQL Linux Shell
linux 下mongodb7版本怎么连?
linux 下mongodb7版本怎么连?
357 10
|
传感器
Arduino光敏传感器控制LED灯亮度
Arduino光敏传感器控制LED灯亮度
bug长时间未修复该怎么办?
bug长时间未修复该怎么办?
198 0
bug长时间未修复该怎么办?
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
245 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
SQL JSON 自然语言处理
数仓建模—建模工具PdMan
工欲善其事,必先利其器,所以开始数仓建模之前我们还是要选择一个合适的建模工具,江湖上混怎么能没有一个响亮的名号和趁手的武器呢,PDMan就是我们要介绍的工具。后面我们还会介绍其他建模工具,你选择一个合适的就行。
2595 0
数仓建模—建模工具PdMan
|
数据采集 监控 数据可视化
用Python构建动态折线图:实时展示爬取数据的指南
本文介绍了如何利用Python的爬虫技术从“财富吧”获取中国股市的实时数据,并使用动态折线图展示股价变化。文章详细讲解了如何通过设置代理IP和请求头来绕过反爬机制,确保数据稳定获取。通过示例代码展示了如何使用`requests`和`matplotlib`库实现这一过程,最终生成每秒自动更新的动态股价图。这种方法不仅适用于股市分析,还可广泛应用于其他需要实时监控的数据源,帮助用户快速做出决策。
579 0
|
网络安全 虚拟化
【网络安全 | 工具】Kali虚拟机安装教程及报错详析
【网络安全 | 工具】Kali虚拟机安装教程及报错详析
720 0
【网络安全 | 工具】Kali虚拟机安装教程及报错详析
|
机器学习/深度学习 并行计算 算法
Ebsynth:利用图像处理和计算机视觉的视频风格转换技术工具
EbSynth 是一款基于视频风格转换技术的工具,专注于将静态艺术风格应用到视频中的每一帧,使视频具有独特的艺术效果。它利用图像处理和计算机视觉技术,将用户提供的参考图像或绘画风格转换为视频效果。
525 2
|
运维 关系型数据库 分布式数据库
【云故事探索】NO.3:智慧出行,云思妙想,看享道出行如何打造智能交通新业态
享道出行运维总监曹亚娟分享了公司如何利用云计算实现创新和发展。作为上汽集团的移动出行品牌,享道出行在阿里云的帮助下,仅用5天完成核心业务搬栈,成为首个使用阿里云PolarDB的大型出行平台。通过深度合作,双方在移动支付等多领域融合,构建全场景智慧出行体验。企业认识到释放云潜力需超越传统IT模式,通过预测算法和Serverless架构优化,提升效率并降低成本。未来,享道出行与阿里云将持续合作,引领移动出行行业的智能化发展。
uniapp使用字体图标
uniapp使用字体图标
337 1