【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这些字符串库函数以及 字符操作
相关文章
|
6月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
102 1
|
1月前
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
32 0
|
5月前
|
安全 编译器 C语言
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
48 1
|
6月前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
6月前
|
C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现2
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
|
6月前
|
安全 C语言 C++
【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现
【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现
|
6月前
strcat与strncat函数使用与模拟实现
strcat与strncat函数使用与模拟实现
37 0
|
6月前
|
存储 C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现1
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
48 0
|
算法 C语言
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
该库函数作用和strcpy很相似,不同点在于
76 0
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)