strcpy() strncpy() strcpy_s()

strcpy()是依据源串的/0作为结束判断的,不检查copy先的Buffer的Size,如果目标空间不够,就有会出现缓冲区溢出问题。

类似这样的函数还有:

字符串拷贝函数:strcpy, wcscpy 
字符串拼接函数:strcat, wcscat  
字符串格式化输出函数:sprintf, swprintf, vsprintf, vswprintf,  
字符串格式化输入函数:scanf, wscanf, sscanf, swscanf, fscanf, vfscanf, vscanf, vsscanf  
stdin流输入函数:gets

这类函数是公认的危险函数,应禁止使用此类函数(微软从Windows Vista的开发开始就全面禁用了危险API)。

解决的办法就是使用strncpy_s()、strcpy_s()、strncpy()等不同环境而准备的安全度很高的函数。

strcpy()

char str[]="lanzhihui is a good boy!";//假设len=strlen(str)

	char str_1[25];

	//测试strcpy()
	memset(str_1,0,sizeof(str_1));

	strcpy(str_1,str);//当数组大小 小于等于 len时,会发生缓冲区溢出,程序崩溃
	                  //当数组大小 大于等于 len+1时,才能正确运行,并且数组尾部为'\0'

	puts(str_1);

strncpy()

char str[]="lanzhihui is a good boy!";//假设len=strlen(str)

	char str_1[25];
        //测试strncpy()
	memset(str_1,0,sizeof(str_1));

	strncpy(str_1,str,sizeof(str_1));//当数组大小 小于等于 len时,也会发生缓冲区溢出,但是程序不会崩溃,发生缓冲区溢出是因为数组没有以'\0'结束,或者说截断超出长度限制的字符串,包括源字符串结尾的’\0’。
	                                 //当数组大小 大于等于 len+1时,才能正确运行,并且数组尾部为'\0'

	str_1[sizeof(str_1)-1]='\0';//上面问题:缓冲区溢出可以通过数组尾部加'\0'解决

	strncpy(str_1,str,sizeof(str_1)-1);//本句正确使用strncpy,不会造成缓冲区溢出,并且在数组最后加入了'\0'。

	puts(str_1);

strcpy_s()

//测试strcpy_s
	memset(str_1,0,sizeof(str_1));
	strcpy_s(str_1,str);//strcpy_s必须完全拷贝源串(假如第二个参数小于源串,会导致运行出错),所以第二个参数可有可无,若只想拷贝一部分源串则应该用strncpy_s函数
	                    //只有当数组大小 大于等于 len+1时,才能正确运行,并且数组尾部为'\0'。
	 
	puts(str_1);


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
strcpystrncpystrncpy_s都是C语言中用于字符串复制的函数strcpy函数用于将一个字符串复制到另一个字符串中。它的原型是: char *strcpy(char *dest, const char *src) strncpy函数也用于将一个字符串复制到另一个字符串中,但它还可以指定要复制的最大字符数。它的原型是: char *strncpy(char *dest, const char *src, size_t n) strncpy_s函数是C11标准引入的安全版本的strncpy函数。它提供了更强的安全性,可以预防缓冲区溢出。它的原型是: errno_t strncpy_s(char * str2, rsize_t size2, const char * str1, rsize_t size1) 在这些函数中,dest表示目标字符串,src或strSource表示源字符串,n或size表示要复制的字符数或缓冲区的大小。这些函数都返回指向目标字符串的指针。 需要注意的是,strncpystrncpy_s函数在复制过程中可能不会自动添加字符串结束符'\0',因此在使用这两个函数时,需要手动添加结束符,以确保字符串的正确结束。 总结起来,strcpy是将一个字符串复制到另一个字符串中;strncpy是在指定的字符数内将一个字符串复制到另一个字符串中;strncpy_s是C11标准中引入的安全版本的strncpy函数,可以预防缓冲区溢出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [strcpystrcpy_s、strncpystrncpy_s 字符串拷贝用法](https://blog.csdn.net/weixin_44084447/article/details/122244567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值