C语言strcpy、strncpy函数是否会复制‘\0‘结束符

article/2025/10/31 4:59:17

1.首先看看strcpy函数的原型

/* strcpy函数原型*/
char *strcpy(char *est,const char *src)
{assert((dest!=NULL)&&(src!=NULL));char *address=dest;while((*dest++ = *src++)!='\0');//直到src字符串结束符'\0'return address;
}

从while循环条件来看,dest会复制src的'\0',如果看不懂这一行的话可以查看:关于c语言字符串指针的自加(++)和(+=1)_猪突猛进进进的博客-CSDN博客C语言字符串指针的自加*str++,*(str++)和*(str+=1),*str+=1https://blog.csdn.net/DRAXY/article/details/123758336?spm=1001.2014.3001.5502

(*dest++ = *src++)这个的值就是*src++的值,验证代码如下:

运行结果箭头处就是'\0' 

可见,dest会一直复制到'\0'才会结束循环,所以'\0'也复制到dest中去了。

2.strncpy函数

如果遇到不需要复制'\0'结束符的情况的话可以使用strncpy函数,其函数原型如下:

char* strncpy(char* dest, const char* src, int len)  
{  assert(dest!=NULL && src!=NULL);  char* temp=dest;  int i=0;  while(i++ < len  && (*temp++ = *src++)!='\0')  {}  if(*(temp)!='\0')  *temp='\0';  return dest;  
}

第三个参数能够限制复制长度,就能不复制'\0'了。

        分别将buf1、buf2、buf3、buf4的长度限制为9、10、11、12,长度为9的buf1只能复制到hellohell(缺少最后一个o,且没有结束符),长度为10的buf2只能复制hellohello(也没有结束符),长度为11的buf3能复制hellohello'\0',长度为12的buf4能复制hellohello'\0'(所以buf4的实际内容为hellohello'\0''c')。

运行结果如下:

         然而buf1没有仅输出hellohello,buf2也没有仅输出hellohello,buf4也没输出hellohello'\0''c'。

 下面分析原因:

1.buf1的输出

        因为buf1只复制了hellohell没有'\0',所以printf输出时没有遇到'\0'就没有结束打印,而是存放在缓冲区,等待遇到'\0'时再输出打印,第一次buf1写入缓冲区hellohell,第二次遇到buf2的hellohello,但是仍然没有遇到'\0',继续写入缓冲区,第三次遇到buf3的hellohello'\0',写入缓冲区,且有'\0'所以,printf输出结果到屏幕上,所以buf1的打印内容就如上图运行结果所示。

2.buf2的输出

        buf2同buf1一样,先将自己的hellohello写入缓冲区,第二次遇到buf3的hellohello'\0',才将内容打印在屏幕上,如上如所示。

3.buf3的输出

        buf3的复制就如strcpy的功能一样,第三个参数的值恰好是字符内容长度(不包括'\0')加一,所以复制到'\0'时结束复制,输出如上图所示。

4.buf4的输出

        buf4经memset、strncpy后内容应该为hellohello'\0''c',printf打印时,遇到'\0'就结束,所以没有打印字母c。

        从上方结果可以看出strncpy的用法细节,使用时应该注意第三个参数--复制的最大长度的控制,以免造成一些意料外的结果。


http://chatgpt.dhexx.cn/article/Y72nmK3C.shtml

相关文章

C语言中的复制函数(strcpy和memcpy)

strcpy和strncpy函数 这个不陌生&#xff0c;大一学C语言讲过&#xff0c;其一般形式为strcpy&#xff08;字符数组1&#xff0c;字符串2&#xff09;作用是将字符串2复制到字符数组1中去。 EX&#xff1a; char str1[10],str2[]{"China"}; strcpy(str1,str2); st…

C语言进阶——字符串函数2:strcpy函数

strcpy函数的理解 strcpy函数其实是一种替换函数&#xff0c;用arr2中的元素去替换arr1中的元素&#xff0c;如果不够的话就会补上’\0’ strcpy函数的数据类型 char* strcpy(char* destination,const char* source);这个函数的两个参数分别是拷贝的终点和拷贝的源头 strcp…

c语言 strcpy作用,c语言中的strcpy什么意思,简单点解释

strcpy是一个C语言的标准库函数&#xff0c;是string copy(字符串复制)的缩写。strcpy函数的作用是把含有\0结束符的字符串复制到另一个地址空间&#xff0c;返回值的类型为char*。 扩展资料&#xff1a; C语言中&#xff0c;strcpy 函数不对数组边界进行检查&#xff0c;因而在…

strcpy函数的作用是什么

strcpy函数的作用是复制字符串。C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大&#xff0c;而源字符串的长度又太长&#xff0c;可能会造成缓冲溢出的情况。声明下面是 strcpy() 函数的声明。c…

C语言strcpy()函数,字符数组复制

需包含头文件&#xff1a;C 标准库 - <string.h> 文章目录 描述声明参数返回值实例实例 1实例 2 20220511 描述 C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 需要注意的是如果目标数组 dest 不够大&#xff0c;而源字符串…

C++ strcpy_s和strncpy_s使用方法

strcpy_s 函数说明 1、头文件 #include <string.h>2、函数声明 errno_t __cdecl strcpy_s(_Out_writes_z_(_SizeInBytes) char* _Destination,_In_ rsize_t _SizeInBytes,_In_z_ char const* _Source);3、函…

C语言strcpy()函数

前言&#xff1a; strcpy函数的作用是把含有转义字符\0即空字符作为结束符&#xff0c;然后把src该字符串复制到dest&#xff0c;且返回值的类型为“char*”&#xff1b;strcpy是“string copy”&#xff08;字符串复制&#xff09;的缩写。 char *strcpy(char *dest, const ch…

C语言strcpy函数的使用

点击蓝字 关注我们 strcpy简单使用&#xff1a; #include <stdio.h> #include <string.h>struct Student {int sid;char name[20];int age;} st; //此处分号不可省略int main(void) {struct Student st {1000,"zhangsan",20};printf("%d %s %d…

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

首先要明确strcpy的功能是&#xff1a;将参数src字符串拷贝至参数dest所指的地址 目录 函数介绍 与strncpy的区别 函数实现1&#xff1a; 函数实现2 改进&#xff1a; 用法示例&#xff1a; 函数介绍 函数原型&#xff1a; char*strcpy&#xff08;char*dest&#xff0c;c…

【C语言】strcpy()函数

文章目录 一、strcpy()函数的简介 二、strcpy()函数的具体使用 三、使用strcpy()函数的注意事项 一、strcpy()函数的简介 strcpy()函数&#xff1a;是将一个字符串复制到另一块空间地址中 的函数&#xff0c;‘\0’是停止拷贝的终止条件&#xff0c;同时也会将 \0 也复制到目…

Sqlserver 查询数据过滤重复,只获取最新一条数据

最近在项目中有这么一个需求&#xff0c;需要从用户提交多条意见中筛选出最新一条数据。因此打算将该语句记录一下。 表结构如下&#xff1a; 普通查询语句&#xff1a; SELECT * FROM T_Dat_OpinionCollection 结果如下&#xff1a; 查询sql&#xff1a; SELECT * FROM (sel…

Kettle(数据过滤)

Kettle(过滤) 原始数据 操作 结果数据

数据预处理之方差过滤

数据预处理之方差过滤 在机器学习的数据预处理的过程中常常会是使用到过滤法&#xff0c;而方差过滤是过滤法之一。所谓的方差过滤就是过滤掉那些特征方差较小的特征。比如一个特征本身的方差很小&#xff0c;就表示样本在这个特征上基本没有差异&#xff0c;可能特征中的大多…

如何使用MyBatis的plugin插件实现多租户的数据过滤?

如何实现多租户数据隔离 在中台服务或者saas服务中&#xff0c;当多租户入驻时&#xff0c;如何保证不同租户的数据隔离性呢&#xff1f;通常的解决方法有三种&#xff0c;分别如下&#xff1a; 一个租户一个独立数据库&#xff0c;这种方案的用户数据隔离级别最高&#xff0…

多种数据过滤与降维算法

数据过滤 1. 缺失值比率 (Missing Values Ratio) 方法的是基于包含太多缺失值的数据列包含有用信息的可能性较少。因此&#xff0c;可以将数据列缺失值大于某个阈值的列去掉。阈值越高&#xff0c;降维方法更为积极&#xff0c;即降维越少。 2. 低方差滤波 (Low Variance Filte…

QT重写QSortFilterProxyModel实现多列数据过滤

在QTableView中可以使用QSortFilterProxyModel来过滤model的数据&#xff0c;可以通过setFilterKeyColumn(int colnum)设置需要过滤的列&#xff0c;当设置为-1时则过滤对象为所有列&#xff0c;但是此种方式只要某一列中有符合条件的数据就会被显示出来 因此我们可以重写QSort…

Java流Stream-1:数据过滤filter

重要&#xff1a;默认过滤数据实体对象时为引用传递。 &#xff08;1&#xff09;若修改过滤后的值&#xff0c;原始值会改变。 &#xff08;2&#xff09;若过滤后的数据需要变更&#xff0c;且原始值不受影响&#xff0c;需要过滤时新建对象。 1 filter方法 按照指定条件过…

【Python数据分析与处理 实训02】 ---2012欧洲杯信息分析(数据过滤与排序)

【Python数据分析与处理 实训02】 —2012欧洲杯信息分析&#xff08;数据过滤与排序&#xff09; 探索2012欧洲杯信息 对于下面的数据集进行简单的一些数据的分析训练 若需要源数据请私信~ 读取数据 euro12 pd.read_csv("G:\Projects\pycharmeProject\大数据比赛\泰迪…

【SQL语法基础】数据过滤:SQL数据过滤都有哪些方法?

我在上篇文章中讲到过&#xff0c;提升查询效率的一个很重要的方式&#xff0c;就是约束返回结果的数量&#xff0c;还有一个很有效的方式&#xff0c;就是指定筛选条件&#xff0c;进行过滤。过滤可以筛选符合条件的结果&#xff0c;并进行返回&#xff0c;减少不必要的数据行…

若依ruoyiAOP切面用于数据过滤和权限处理实例

目录 1.什么是AOP 简介 2.若依的AOP实现 2.1若依数据过滤AOP 定义注解 实现切面类 2.2数据源AOP 1.什么是AOP 简介 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能的统一…