目录

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相关推荐

  1. strcpy和memcpy的区别 | strcpy和strncpy的区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...

  2. strcpy()和memcpy()的区别

    Strcpy和memcpy都可以用来拷贝字符串,strcpy以\0结束,但memcpy必须指定拷贝的长度,类似于strncpy Strncpy与memcpy类似,区别是:当遇到\0时,strncpy停 ...

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

    strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str ...

  4. c语言strcpy两字符串长度不同,C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预 ...

  5. strcpy和memcpy的区别(转)

    转自:http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html strcpy和memcpy都是标准C库函数,它们有下面的特点. s ...

  6. C/C++基础面试集锦(一)strcpy、memcpy

    **一.strcpy函数实现方法** char* strcpy(char *dest, const char *src) {assert((dest != NULL) && (src ...

  7. 【c++】10. memset()、【strcpy_s()、memcpy_s()】、【strcpy(),memcpy()】

    选择使用[strcpy_s.memcpy_s]还是选择[strcpy,memcpy]? memset()的用法 memcpy_s,strcpy_s函数明确的指定了目标内存的大小,能够清晰的暴露出内存溢 ...

  8. c语言深入浅出(一)strcpy和memcpy的区别

    c语言深入浅出(一)strcpy和memcpy的区别 strcpy和memcpy都是c语言的库函数 strcpy:只用于字符串的复制,当碰到'\0'就停止了 memcpy:用于这个内存的拷贝,适用于结 ...

  9. strcpy、memcpy和memset的区别

    strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字 ...

最新文章

  1. DELL本本 执行SQL语句要FN+F5 如何更改成F5
  2. 11g 64位部分安装过程
  3. laravel框架中文手册_Laravel框架的这些你都懂的话,它核心架构基本就懂了
  4. parzen窗估计如何进行结果分析_实现一下模式识别(一)Parzen窗估计
  5. SSL/TLS协议运行机制
  6. Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2
  7. 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作
  8. 怎么修改ppt的虚线间隔_还有一小时下班,领导交给我一份ppt,做不完不许走!...
  9. WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证
  10. 深度学习标注工具LabelImg的使用方法
  11. axios 文档中文翻译
  12. Oracle 数据库锁机制
  13. tl494cn逆变器电路图_TL494CN逆变器
  14. 您应该知道的代码审查工具
  15. 加州大学戴维斯分校 计算机科学,UCDavis的Computer Science「加州大学戴维斯分校计算机科学专业」...
  16. android 高德地图之poi搜索功能的实现
  17. Postman:常用的Pre-request Script方法【MD5+时间戳+获取当前时间】
  18. lightroom 闪退_微信QQ一碰就闪退,别人永远看不了你的隐私~
  19. 【TensorRT】PyTorch模型转换为ONNX及TensorRT模型
  20. ESXI8.0一键安装黑群晖DSM7

热门文章

  1. 用迭代法求 x=根号a。求平方根的迭代公式为:X(n+1)=(Xn+a/Xn) /2。
  2. 鸿蒙系统生态建设怎样了,鸿蒙系统正式发布-华为OS生态建设开始布局
  3. Linux:syscall: entry_SYSCALL_64_after_hwframe
  4. 【Kafka】kafka架构
  5. postman使用教程1
  6. Unity 判断点击的是否是UI
  7. sql语句 execute、executeQuery和executeUpdate之间的区别
  8. 关于executeUpdate方法返回的值问题
  9. 笑评中国五大互联网大佬
  10. RTCP(一): RR--Receiver Reports 接收者报告