strncpy和strcpy和memcpy
目录
strcpy的简单用法
strcpy的数据含 0 或者'\0' 带来的问题
strncpy
解决方案memcpy:
简单小结:
strcpy的简单用法
#include <iostream> using namespace std;int main() {char str[4] = {0};char *p = "abc";strcpy(str, p);cout << str << endl; // abcreturn 0; }
拷贝abc到str数组,能正常输出。
strcpy的数据含 0 或者'\0' 带来的问题
- 拷贝字符含'\0'的情况
#include <stdio.h>int main() {char str[10] = {0};char *p = "ab\0defg";strcpy(str, p);printf("%s", str); // abreturn 0; }
如上,结果为ab ,并没有被完全拷贝
- 拷贝字符含0的情况, 也是会不被完全拷贝,下面的test的调用很常见,可能传入的字符如果含 '\0'或者 0 ,那么会导致不完全拷贝。
#include <stdio.h>void test1 (void* data) {char recv[10];char* xx = (char*)data;strcpy(recv, xx);printf("test1 [%s]\n", recv); // test1 [1]} void test2 (void* data) {char recv[10];char* xx = (char*)data;strcpy(recv, xx);printf("test2 [%s]\n", recv); // test2 [10]} int main() {char str1[10] = {'1','\0',0,'1','0','1','0',0};test1(str1);char str2[10] = {'1','0',0,'1','0','1','0',0};test2(str2);return 0; }
strncpy
- strncopy能避免上面因字符带0产生的问题吗?很遗憾的是不会,strncpy的源码也是依据0的结束符来判断是否拷贝完成,只是限定了拷贝的个数,避免越界,比如下面这样,也是有问题的,明明strncpy要求拷贝10个,但因为出现的'\0'让拷贝失败
#include <stdio.h>void test1 (void* data) {char recv[10];char* xx = (char*)data;strncpy(recv, xx,10);printf("test1 [%s]\n", recv); // test1 [12345]}int main() {char str1[10] = {'1','2','3','4','5','\0','7'};test1(str1);return 0; }
解决方案memcpy:
上面的方案都有毛病,那解决方案就是memcpy
#include <stdio.h>void test1 (void* data) {char recv[10];char* xx = (char*)data;memcpy(recv, xx,10);printf("test1 [");for(int i = 0; i < 10; i ++)printf("%c", recv[i]); //test1 [12345789a] 第6个字符为空printf("]\n");}int main() {char str1[10] = {'1','2','3','4','5','\0','7','8','9','a'};test1(str1);return 0; }
但memcpy会把字符的 0 和\0一起拷贝到buffer里,用%s打印依旧会打不出 789a, 但memcpy会根据个数来定需要拷贝多少字节,不会因为0而不拷贝。
简单小结:
- strcpy会根据结束符来限制拷贝个数,会被结束符影响。
- strncpy会根据传入参数限制拷贝的个数,仍然会被结束符影响。
- memcpy的拷贝仅受传入参数限定的个数影响
strncpy和strcpy和memcpy相关推荐
- strcpy和memcpy的区别 | strcpy和strncpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...
- strcpy()和memcpy()的区别
Strcpy和memcpy都可以用来拷贝字符串,strcpy以\0结束,但memcpy必须指定拷贝的长度,类似于strncpy Strncpy与memcpy类似,区别是:当遇到\0时,strncpy停 ...
- C语言中的复制函数(strcpy和memcpy)
strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str ...
- c语言strcpy两字符串长度不同,C语言 strcpy和memcpy区别详细介绍
C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预 ...
- strcpy和memcpy的区别(转)
转自:http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html strcpy和memcpy都是标准C库函数,它们有下面的特点. s ...
- C/C++基础面试集锦(一)strcpy、memcpy
**一.strcpy函数实现方法** char* strcpy(char *dest, const char *src) {assert((dest != NULL) && (src ...
- 【c++】10. memset()、【strcpy_s()、memcpy_s()】、【strcpy(),memcpy()】
选择使用[strcpy_s.memcpy_s]还是选择[strcpy,memcpy]? memset()的用法 memcpy_s,strcpy_s函数明确的指定了目标内存的大小,能够清晰的暴露出内存溢 ...
- c语言深入浅出(一)strcpy和memcpy的区别
c语言深入浅出(一)strcpy和memcpy的区别 strcpy和memcpy都是c语言的库函数 strcpy:只用于字符串的复制,当碰到'\0'就停止了 memcpy:用于这个内存的拷贝,适用于结 ...
- strcpy、memcpy和memset的区别
strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字 ...
最新文章
- DELL本本 执行SQL语句要FN+F5 如何更改成F5
- 11g 64位部分安装过程
- laravel框架中文手册_Laravel框架的这些你都懂的话,它核心架构基本就懂了
- parzen窗估计如何进行结果分析_实现一下模式识别(一)Parzen窗估计
- SSL/TLS协议运行机制
- Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2
- 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作
- 怎么修改ppt的虚线间隔_还有一小时下班,领导交给我一份ppt,做不完不许走!...
- WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证
- 深度学习标注工具LabelImg的使用方法
- axios 文档中文翻译
- Oracle 数据库锁机制
- tl494cn逆变器电路图_TL494CN逆变器
- 您应该知道的代码审查工具
- 加州大学戴维斯分校 计算机科学,UCDavis的Computer Science「加州大学戴维斯分校计算机科学专业」...
- android 高德地图之poi搜索功能的实现
- Postman:常用的Pre-request Script方法【MD5+时间戳+获取当前时间】
- lightroom 闪退_微信QQ一碰就闪退,别人永远看不了你的隐私~
- 【TensorRT】PyTorch模型转换为ONNX及TensorRT模型
- ESXI8.0一键安装黑群晖DSM7
热门文章
- 用迭代法求 x=根号a。求平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2。
- 鸿蒙系统生态建设怎样了,鸿蒙系统正式发布-华为OS生态建设开始布局
- Linux:syscall: entry_SYSCALL_64_after_hwframe
- 【Kafka】kafka架构
- postman使用教程1
- Unity 判断点击的是否是UI
- sql语句 execute、executeQuery和executeUpdate之间的区别
- 关于executeUpdate方法返回的值问题
- 笑评中国五大互联网大佬
- RTCP(一): RR--Receiver Reports 接收者报告