C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()

比较函数大合集:strcmp,strncmp,memcmp 比较函数三兄弟:strcmp,strncmp,memcmp。 刷到就是赚到,看到就是学到!!比较函数看这一篇足以! 看完保证你对于三个函数理解透彻到底。 阅读详情

C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()

 

        在了解strncpy、strncat()、前,需要先了解strcpy()、strncat():

C语言函数:字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-CSDN博客

strncpy():

        作用:拷贝受限制长度的字符串,意思是:可以指定拷贝字符的个数到目标字符串内。

        限制字符串个数是为了让程序相对安全,降低访问越界等情况出现的可能性。但是不会绝对安全,一个程序员要写bug如挥手一般简单.

参数部分:

char * __cdecl strncpy (
        char * dest,
        const char * source,
        size_t count
        )

count是指定传入的个数。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	char de[20] = "abcdef";
	char so[] = "qwer";
	strncpy(de, so, 2);//拷贝2个字符
	printf("%s\n", de);
	//结果:qwcdef
	return 0;
}

        当拷贝的字符串的个数超出原字符串的个数时,多出的部分会传\0进去:

 

 

strncpy函数的实现:

        在strcpy基础上,写strncpy并不难。

        因此直接展示源码:

char * __cdecl strncpy (
        char * dest,
        const char * source,
        size_t count
        )
{
        char *start = dest;

        while (count && (*dest++ = *source++) != '\0')    /* copy string */
                count--;

        if (count)                              /* pad out with zeroes */
                while (--count)
                        *dest++ = '\0';

        return(start);
}

        因为多了count用于控制长度,所以while循环也多了一个count:

        当count不为0时,while循环继续。

        直到count为0时,自动跳出。

        (*dest++ = *source++) != '\0') 和strcpy一样。其中!=\0可以去掉。

        当没有\0时,dest和source一起++找下一个字符。

        当在source找到\0时,把\0传入后while循环结束

        if语句是为了保证count被置为0,因为count是我们需要拷贝的字符串个数。

        就是上面所说的,如果超越了source本身的个数,会自动补\0

        最后return 最初的dest,即start

strncat():

        作用:追加受限制的字符串。

参数部分:

char * __cdecl strncat (
        char * front,
        const char * back,
        size_t count
        )

         

int main()
{
	char de[20] = "abcd";
	char so[] = "qwer";
	strncat(de, so, 2);
	printf("%s\n", de);
	//结果:abcdqw
	return 0;
}

        与strncpy一样,如果追加的个数超出so的范围呢?会和strcpy一样?

int main()
{
	char de[20] = "abcd";
	char so[] = "qwer";
	strncat(de, so, 6);
	printf("%s\n", de);
	//结果:abcdqwer
	return 0;
}

        并不会,具体是怎么做的呢?那就先看看这个函数的实现:

strncat的实现:

strncat的源码:

char * __cdecl strncat (
        char * front,
        const char * back,
        size_t count
        )
{
        char *start = front;

        while (*front++)
                ;
        front--;

        while (count--)
                if ((*front++ = *back++) == 0)
                        return(start);

        *front = '\0';
        return(start);
}

        第一个while循环,和strcat一样,先找到front的\0,然后从\0开始向后追加。

        第二个while循环,count--作为条件语句,意思是循环count次,从而可以保证追加的个数。

        while循环的if语句,是从front的\0开始向后追加back的元素,当在back中遇到是\0时,==0,那么就直接返回。因此如果追加的个数超出范围,不会追加\0,而是直接返回。

        当count==0时,while循环退出,说明目前为止,已经把想传入的字符串传完了,因为上面是后置++,所以此时的front已经指向了最后一个元素的后面的指针。所以直接将此时指针指向的front的元素改成\0,即: *front = '\0';

        最后return 原front地址

strncmp():

   在了解strncmp()前,需要先了解strcmp():

C语言函数:字符串函数及模拟实现strcmp()_srhqwe的博客-CSDN博客

        作用:对比受限制的两串字符串

        strncmp和strcmp其实相差并不大,只是限制了对比的范围。返回值与strcmp是一样的

        

 参数部分:

int __cdecl strncmp
(
    const char *first,
    const char *last,
    size_t      count
)

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	char de[20] = "abcd";
	char so[] = "aba";
	strncmp(de, so, 3);
	printf("%s\n", de);
	//结果:1
	return 0;
}

        输入3比较的就是de和so的前三个字符

        

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	char de[20] = "abad";
	char so[] = "aba";
	int ret = strncmp(de, so, 7);
	printf("%d\n",ret );
	//结果:1
	return 0;
}

        即使输入的数字超出了两个字符串的个数也没事,因为往后比较的都是\0。与strcmp基本一致。

strncmp()函数的实现:

        strncmp函数源码:

int __cdecl strncmp
(
    const char *first,
    const char *last,
    size_t      count
)
{
    size_t x = 0;

    if (!count)
    {
        return 0;
    }

    if( count >= 4 )
    {
        /* unroll by four */
        for (; x < count-4; x+=4)
        {
            first+=4;
            last +=4;

            if (*(first-4) == 0 || *(first-4) != *(last-4))
            {
                return(*(unsigned char *)(first-4) - *(unsigned char *)(last-4));
            }

            if (*(first-3) == 0 || *(first-3) != *(last-3))
            {
                return(*(unsigned char *)(first-3) - *(unsigned char *)(last-3));
            }

            if (*(first-2) == 0 || *(first-2) != *(last-2))
            {
                return(*(unsigned char *)(first-2) - *(unsigned char *)(last-2));
            }

            if (*(first-1) == 0 || *(first-1) != *(last-1))
            {
                return(*(unsigned char *)(first-1) - *(unsigned char *)(last-1));
            }
        }
    }

    /* residual loop */
    for (; x < count; x++)
    {
        if (*first == 0 || *first != *last)
        {
            return(*(unsigned char *)first - *(unsigned char *)last);
        }
        first+=1;
        last+=1;
    }

    return 0;
}

        第一个if语句,如果count==0那么就不用比较了,因为比较的区间没有。

        第二个if语句只是将区间划分成[0,4]和(4,正无穷)讨论

        之后的语句就是把每个每个字符进行比较,返回比较的结果。

【C语言strncpy,strncat,strncmp,memcpy,memmove,memcmp,memset的模拟实现 首先注意,接下来的函数基本都需要目标内存块足够大。 阅读详情

相关推荐

字符串函数模拟实现之strcpy、strncpy、strcmp、strncmp、strcat、strncat

一、strcpy与strncpy函数模拟实现 1、strcpy函数模拟实现       strcpy函数原型为 char *strcpy(字符数组1,字符串2),strcpy是string copy(字符串复制)的简称,表示“字符串复制函数”,作用是将字符串2复制到字符数组1中去。基本功能我们都清楚,那么在函数产生作用前后数组1所在内存发生了什么事呢?我们先使用一下strcpy函数看对数组

xuzhangze的博客 1781

C#实现strncpy函数功能(附完整源码)

C#实现strncpy函数功能(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 406

C语言实现strncpy函数功能(附完整源码)

C语言实现strncpy函数功能(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 721

strncpy函数详解看这一篇就够了-C语言函数实现、使用用法举例、与strcpy的区别)

首先要明确strncpy的功能是:拷贝src字符串的前n个字符至dest 目录 函数介绍 与strcpy的区别 函数实现: 用法示例: 结果展示: 函数介绍 函数原型:char *strncpy(char *dest, const char *src, int n) 返回值:dest字符串起始地址 说明: 1、当src字符串长度小于n时,则拷贝完字符串后,剩余部分将用空字节填充,直到n个 strncpy不会向dest追加’\0’。 2、src和dest所指的内存区域不能...

kim的博客 6万+

C语言中的strncpy()函数详解

strncpy函数用于将一个字符串复制到另一个字符串,但与strcpy不同,它允许我们指定要复制的字符数量。这使得strncpy在处理字符串复制时更加安全,特别是当目标缓冲区的大小已知时。strncpy函数是C语言中用于字符串复制的一个重要函数,它提供了对目标缓冲区长度的控制,从而避免了缓冲区溢出问题。通过正确使用strncpy,我们可以提高程序的安全性和稳定性。在本文中,我们详细介绍了strncpy函数的定义、用法、应用场景、常见问题以及一些示例代码,帮助读者全面理解和正确使用该函数

新华编程特战队 1万+

字符串函数(二)

字符串函数

subyu的博客 153

C语言strncpystrncatstrncmp函数详解

strncpy函数是一个C标准库函数,功能与strcpy函数相同,用于将一个字符串复制到另一个字符串,但strncpy函数不同与strcpy函数的是,strncpy可以指定复制的字符数量。头文件为#include;strncpy函数原型:char *strncpy(char *dest, const char *src, size_t n);参数说明:dest 目标字符串src 源字符串n 要拷贝的源字符串的个数。

2301_79180143的博客 6051

54.【C语言】 字符函数字符串函数(strncpy,strncat,strncmp函数)

和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数

zhangcoder的博客 记录学习轨迹~ 1852

【C语言入门级教学】strncpystrncatstrncmp、strstr、strtok、strerror、perror函数

• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。:⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。• 如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。

王璐WL的博客 1831

C语言字符字符串函数:strcpy、strcat、strcmp介绍和模拟实现以及stnrcpy、strncatstrncmp介绍(近万字详解,建议三连收藏)

函数头文件:string.h函数参数:① char * destination:追加目的空间的地址②const char * source:字符串的地址返回值类型:char*返回值:返回目的字符串的地址也就是考到到某个地方,这个某个地方的地址。函数功能:将源字符串直到\0以前的所有内容追加到目的空间,包括\0.源字符串必须以 '\0' 结束。会将源字符串中的 '\0' 追加到目标空间。目标空间必须足够大,以确保能存放源字符串。目标空间必须可变函数头文件:string.h。

m0_71503225的博客 4039

冰冰学习笔记:strncpystrncatstrncmp

长度受限制的字符串处理函数 模拟实现strncpystrncatstrncmp

bingbing_bang的博客 4851

【C语言进阶】常见的字符串函数和内存函数详解及模拟实现

总结了常见的字符串函数和内存函数,图文结合,通俗易懂,非常值得收藏学习。

大猩猩!的博客 4187

【C语言】_strncpystrncatstrncmp

关于字符串函数,已介绍过strlen、strcpy、strcat、strcmp等函数。其中,strcpy、strcat、strcmp称为长度不受限制的字符串函数;求字符串长度函数strlen相关文章如下:【C语言】_字符串函数strlen-CSDN博客长度不受限制的字符串函数文章链接分别如下:字符串拷贝函数strcpy:【C语言】_字符串函数strcpy-CSDN博客字符串追加函数strcat:【C语言】_字符串函数strcat-CSDN博客字符串比较函数strcmp:,称为;

m0_63299495的博客 1169

【C语言字符串函数

长度受限的字符串函数 字符串查找 错误信息报告 字符分类函数

weixin_60478154的博客 2万+

【C语言模拟实现字符串函数(下)

关关难过关关过 前路漫漫亦灿烂 今天 阿紫 就继续带领大家一起挑战字符串函数模拟实现

拼命阿紫冲冲冲! 8871

【C语言】长篇详解,字符系列篇2-----strcat,strcmp,strncpystrncatstrncmp函数的使用和模拟实现【图文详解】

上一篇说到,在C语言中,我们常常碰见各种字符,也需要对字符进行处理,那C语言提供了一系列的库函数,来帮助我们处理各种情况。字符函数字符串函数,字符分类函数,还有字符转换函数……本期我们将深入了解各种字符串函数(strcpy,strcat,strcmp,strncpystrncat

cilmy23的note 2090

strncpystrncatstrncmp字符串函数详解(长度受限制)

详细介绍了strncpystrncatstrncmp这三个长度受限制的字符串函数

天行健、君子以自强不息 3922

字符串函数(strcmp,.strncpystrncatstrncmp)-----下(多积累才能进大厂),手撕字符串函数

今天小编带大家学习字符串函数下,包括strcmp,.strncpystrncatstrncmp,带大家手撕字符串函数!!!

weixin_67900732的博客 5034
上一篇: C语言函数:字符串函数及模拟实现strcmp()
下一篇: 进制的转换:
srhqwe
博客等级 码龄7年 85粉丝 107原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

srhqwe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值