c语言字符串函数之strcpy,strcat,strncpy,strncat函数解析

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
      char* strcpy(char *dst, char const * src)
      {
           assert((src != NULL) && (dst != NULL));
           char *tmp = dst;
           while ((*dst++ = *src++) != '\0');
           return tmp
      } 

      上述即为strcpy函数实现。如果参数src和dst在内存中出现重叠,其结果是未定义的。程序员必须保证dst足够长,否则的话,如果src长达大于dst,那么为了把src复制给dst,会侵占dst数组后面的部分内存空间,改写原先恰好存储在那里的变量。例如,看如下代码:

      chap dst[5];
      char *src = "abcde";   //会在末尾加上NULL字节,所以该字符串长度为6
      strcpy(dst, src);

     上面,dst长度为5,而src长度为6,肯定会侵占dst后面一个字节的内存,但在语法上是正确的,别想编译器给你报错。这肯定是一个隐藏的bug。

     char* strcat(char *dst, char const* src)
     {
           char *tmp = src;
           while (*dst)
              ++dst;
           while ((*dst++ = *src++) != '\0');         //该循环结束时,已将将src的NUL字节复制给了dst
           return tmp
     }

      上述即为strcat函数实现。同strcpy一样,程序员必须保证dst足够长,否则会侵占dst后面的部分内存空间。

      char* strncpy(char* dst, char const *src, size_t count)
      {
          char * tmp = dst;
          while (count && (*dst++ = *src++))      //判断src是否到达末尾,且待复制的字节数是否减为0
                 --count;
          if (count)                  //如果count!=0,即src到达末尾,则在末尾添加count个NUL字节,若coun==0,复制完成。返回
                while (--count)
                 *dst = '\0'
          return tmp
      }

       这个函数是不安全的。它调用的结果可能不是一个字符串,因为字符串必须以NUL字节结尾。如果在一个需要字符串的地方使用了一个不是以NUL字节结尾的字符序列,会发生什么呢?这个问题只有当你使用strncpy函数创建字符串,然后或者对它们使用str开头的库函数,或者在printf中使用%s格式码打印它们时才会发生。在使用不收限制的函数之前,你首先必须确保字符串实际上是以NUL字节结尾的,例如,考虑以下代码段:

        char buffer[BUFSIZE]
        .........
        strncpy(buffer, name, BUFSIZE)
        buffer[BUFSZE - 1] = '\0'
char* strncat(char *dst, const char* src, size_t count)
{
	if (count)
	{
		char *tmp = dst;
		const char *s = src;
		while (*tmp)					//循环结束时,tmp指向了NUL字节。
			tmp++;
		do 
		{
			if ((*tmp = *src++) == 0)	//这里src第一个字符覆盖了dst原本的NUL字节
				break;
			tmp++;
		} while (--count);
		*tmp = 0;                      //复制完毕后,将最后一个字节置为NUL字节
	}
	return dst;
}       
       

     与strncpy不同的时,在结束时,strncat总是在结果字符串的后面添加一个NUL字节,而且它不会像strncpy那样对目标数组用NUL字节进行填充。
 

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

相关推荐

一篇看懂 C语言常用 字符串函数,全网最全整理!

看下去一定对你有帮助!有帮助就点个赞吧 字符串函数 指的是头文件string.h里定义的 我们日常直接用的函数。 一下是本节重点讲解的 6函数。对初学者生僻点的字符串函数我们下节再讲。 putchar getchar strlen strcmp strcpy strcat 这些函数我们到处在用,可你有没有想过,究竟这些函数是怎么声明和定义的?他们远没有你想的那么简单。 一下被划掉的部分...

不会编程的程序圆 的博客 2235

C/C++中strcpystrcat,strstr以及strncpystrncat,strncmp的使用

这两种参数形式没有什么差别,它的如要作用为在str1中查找是否有str2字符串,也就是查找str1中是否有str2的一部分,如果有则返回str1中与str2中相同的字符串的第一个字符的地址,这里需要特别注意的是strstr函数真能返回从左往右第一个str1中和str2中的第一个字符的的值,如果str1中有多个str2那么值返回str1中第一个str2的首元素地址。那么这个函数是怎么用的呢?strncmp:它的作用依旧是比价字符串的大小,但与strcmp不同的是它也是可以先限定前几个进行比较。

westdjjdjdk的博客 1771

字符串函数精讲1

字符串函数精讲1

2302_77675796的博客 1567

C语言字符串函数strlen、strcpystrcat、strcmp、strstr的介绍讲解和底层代码模拟实现

快速了解strlen、strcpystrcat、strcmp、strstr五个字符串函数和其底层代码逻辑

2202_75305885的博客 1万+

strcat&strcpy&strncpy

strcat&strcpy&strncpy strcat 将两个char类型链接 char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结果放在d中 printf("%s",d);输出 d 为 GoldenGlobalView (中间无空格) d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。 返回指向

nanaMasuda的博客 721

【c语言strcpystrcat、strcmp、strncpystrncat、strncmp 字符串函数的使用以及模拟实现(附图文解析

strcpy的介绍将source指向的 C 字符串复制到指向的数组中,包括终止 null 字符'\0'(并在该点处停止)。为避免溢出,目标指向的数组的大小应足够长,以包含与source相同的 C 字符串(包括终止 null 字符),并且不应在内存中与source重叠。返回值是destination所指向的首元素地址。strcpy的使用int main()printf("使用strcpy前%s\n",arr2);//将arr1拷贝到arr2。

qq_34169263的博客 723

C语言--strcpy/strncpy strcat/strncat strcmp/strncmp strtok strstr详解及模拟实现

C语言字符串处理函数详解及模拟实现

2302_80868583的博客 1429

C语言字符串操作函数详解:strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat

引言在C语言编程中,字符串处理是基础且频繁的操作。C标准库<string.h>提供了一系列强大的字符串操作函数,它们高效、灵活,但同时也因缺乏边界检查而潜藏安全风险。本文将深入解析最常用的七个字符串函数:strlen, strcpy, strcmp, strcat, strncpy, strncmp, strncat,说明其功能、用法、经典示例,功能:统计参数 str 指向的字符串的⻓度。统计的是字符串中 ‘\0’ 之前的字符的个数。参数:str :指针,指向了要统计⻓度的字符串

dumengyang1的博客 165

详谈C语言strcpy,strncpy,strcat,strncat,strcmp,strncmp,strlen,memcpy,memset,strchr常用函数

我发现在开发过程中或者面试过程中经常会遇到这些函数strcpy,strncpy,strcat,strncat,strcmp,strncmp,strlen,strchrmemset,memcpy),从过往经验来看大部分面试都是不能调用库函数,需要实现函数原型。可见这些函数的底层原理其重要性和作用就不多说了。经过对这些函数的不断研究和验证,下面就一一详谈这些函数的功能和特性以及函数实现。 1.strcpy函数 函数原型:char *strcpy(char *dest, const char *src); 函数

Mr.Kevin的博客 1498

strlen,strcpy,strncpy,strcat,strncat函数原型代码

** strlen,strcpy,strncpy,strcat,strncat函数原型代码 **#include<stdio.h> #include<assert.h> size_t mystrlen(const char s){ assert(s!=NULL); size_t len=0; for(len=0;(s+len)!=’\0’;len++); return 0; } char *mystrcpy(char *dest,const char *src){ ass...

weixin_43854723的博客 193

strcpy/strcat && strncpy/strncat && strlcpy/strlcat 总结

<!--v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}--> Normal 0 7.8 磅

lxn_cool的专栏 799

字符串中的函数原型(strlen,strcpy,strncpy,strcat,strncat,strcmp,strncmp,memcpy)

字符串中的函数原型 strlen #include<stdio.h> #include<assert.h> size_t mystrlen(char *dest){ assert(dest!=NULL); size_t len; for(len=0;*(dest+len)!='\0';len++); return len; } strcpy #include<stdio.h> #include<assert.h> char *mystrcpy(cha

正阳初六_的博客 348

C语言字符串函数详解&模拟实现(strlen、strcpystrcat、strcmp)+字符操作函数+字符转换函数

C语言字符串函数详解&模拟实现(strlen、strcpystrcat、strcmp)+字符操作函数+字符转换函数

qq_35904005的博客 2826

深入理解《字符串》及其函数——C语言

C语言字符串 字符串函数 📌strlen 函数模拟 📌strcpy 函数模拟 📌strcat 函数模拟 📌strcmp 函数模拟 📌strncpy 📌strncat 📌strstr 函数模拟 📌strtok 📌streeor 📌字符分类函数 内存函数 📌memcpy 函数模拟实现 📌memmove

一些七零八碎的知识点 3655

模拟实现C库函数strcpystrncpystrcatstrncat,strcmp,strncmp,strstr ,strchr ,memcpy ,memmove

实现strcpy #include<stdio.h> #include<stdlib.h> #include<assert.h> char *Strcpy(char*dest, const char*src) { char*p = dest; assert(dest != NULL&&src != NULL); while (*dest++...

Nono 213

C语言—详解库函数中常用的字符串函数

C语言中常用的字符串操作函数

qq_74009838的博客 839

C语言中string函数库中的一些函数的用法

1、memcpy函数 4、memset函数7、strncat函数10、strdup函数13、strstr函数 2、memmoer函数5、strncpy函数8、strcmp函数11、strndup函数 3、strcpy函数6strcat函数9、strncmp函数12、strchr函数

weixin_53147505的博客 5292

零基础学 C 语言:字符函数字符串函数解析

本文全面解析了C语言中字符函数字符串函数的使用与实现。主要内容包括:字符分类函数(如islower)用于判断字符类型,字符转换函数(tolower/toupper)实现大小写转换;字符串函数如strlen获取长度、strcpy复制字符串strcat连接字符串的原理及模拟实现方法;还介绍了更安全的strncpy等长度限制函数。通过代码示例详细演示了各类函数的具体应用场景和实现逻辑,帮助初学者系统掌握C语言字符串处理的核心技术要点。

2401_82420627的博客 1107

C语言字符函数字符串函数就该这样学!!!

*C语言字符函数字符串函数,从0到深入,使用到模拟生成这一篇就够了!!! 前言 **本篇介绍字符函数字符串函数,从0到精通,如何引用到如何模拟实现。 在C语言中,经常对字符串进行操作,所以很多库函数我们直接调用即可,但是如果想要深入了解C语言,我们要知道他的原理是怎样实现的,别怕我来也! ** 一,C语言中有字符串类型吗? ** - 答案:是没有的,字符串通常放在字符串常量和字符串数组中; 字符串常量:是不能改变的 你看这个字符串,只是把字串首字母的地址存到了p中,用字符串拷贝函数,把str拷贝到p中

m0_56398287的博客 451
上一篇: c语言关于strlen函数的理解
下一篇: C语言与字符串相关的查找函数
红桃Ace
博客等级 码龄15年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值