1、strcpy

原型声明:
extern char *strcpy(char* dest, const char *src);

依据源串的\0作为结束判断的,不会检查需要拷贝的缓冲区的大小,如果目标空间不够,就有溢出问题。

2、strncpy

原型

char * strncpy(char *dest, char *src, size_t n);

复制字符串src中的内容(字符,数字、汉字....)到字符串dest中,复制多少由size_t的值决定,返回指向dest的指针。如果遇到空字符('\0'),则空字符后面为原来的字符

代码如下:

dest[]="Hell99iam!";
src[]="abc\0def";
strncpy(dest,src,5);

此时,dest区域是这样的:'a','b','c','\0','\0','9','i','a','m','!'

而非这样:'a','b','c','\0','\0','\0','\0','\0','\0','\0'

'\0','\0'并不是添加在'!'的后面。可以用for循环输出每个元素的ascii来确定。

strncpy是字符串拷贝推荐的用法

3、strncpy_s

原型:
errno_t strncpy_s(
char *strDest,
size_t numberOfElements,
const char *strSource,
size_t count
);

参数numberOfElements表明dest中的字节数,防止目标指针dest中的空间不够,同时返回值改成返回错误代码,而不是返回char*。

会在字符串结束处填补一个空字符。

count参数需要小于目标缓冲区大小。

如果情况如下代码:

char dst[5];
strncpy_s(dst, sizeof(dst), "a long string", 5);

表示使用strncpy_s 拷贝5个字节到dst缓冲区,使得没用多余空间给空字符结束符,填补空字符时会溢出,并调用异常处理句柄。

需要补空字符时使用 _TRUNCATE 或者 (size – 1)

代码如下:

char dst[5];
strncpy_s(dst, sizeof(dst), "a long string", _TRUNCATE);
strncpy_s(dst, sizeof(dst), "a long string", sizeof(dst)-1);

跟strncpy不一样,当count参数比源字符串长时,strncpy_s 不会一直补空字符到指定长度。

如果源地址字符串和目标地址字符串重叠,则结果未定义。

_s版本函数并不是标准库,不推荐使用

4、snprintf

原型:

int snprintf(char *str, size_t size, const char *format, ...)

将可变个参数(...)按照format格式化成字符串,然后将其复制到str中

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');

(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。

#include <stdio.h>
int main () {char a[16];size_t i;i = snprintf(a, 13, "%012d", 12345);  // 第 1 种情况printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 000000012345i = snprintf(a, 9, "%012d", 12345);   // 第 2 种情况printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 00000001return 0;
}

strcpy、strncpy、strncpy_s和snprintf相关推荐

  1. strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove

    strcpy和strncpy区别(2009-04-27 15:48:52) 转载标签:杂谈 分类:C++/C 第一种情况: char* p="how are you ?"; cha ...

  2. strcpy ,strncpy ,strlcpy地用法

    strcpy ,strncpy ,strlcpy地用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. s ...

  3. (C语言)常用的字符串函数介绍(strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchar,strlen)非常详细

    理解 strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchar,strlen这些函数,可以帮助我们更好的对字符串进行操作,做到玩转字符串. 目录 1.s ...

  4. C语言中函数strcpy ,strncpy ,strlcpy的用法

    C语言中函数strcpy ,strncpy ,strlcpy的用法 http://hi.baidu.com/qi_hao/blog/item/043ef21c6e26c58286d6b678.html ...

  5. C语言strcpy,strncpy和strlcpy讲解

    前言 C风格的字符串处理函数有很多,如strcpy().strcat()等等. strcpy与strcat char* strcpy (char* dest, const char* src); ch ...

  6. memcpy, strcpy, strncpy的区别和用法

    注意事项 strcpy 是依据 "\0" 作为结束判断的,如果 s2 的空间不够,则会引起 buffer overflow. memcpy用来在内存中复制数据,由于字符串是以&qu ...

  7. strcpy,strncpy,memcpy,memmove

    ❤️强烈推荐人工智能学习网站❤️ 这4个字符串处理函数是我们经常用到的,下面我们来了解释一下它们之间的区别. strcpy:只用于字符串的复制,以\0为结束符,且\0也一并拷贝过去.不需要在末尾加上\ ...

  8. memcpy,strcpy,strncpy

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  9. linux strcpy函数,C语言中函数strcpy ,strncpy ,strlcpy,strcpy_s的用法

    好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. strcpy 我们知道,strcpy 是依据 \0 作为结 ...

最新文章

  1. Canvas的save和restore方法
  2. cad蜂鸟工具_蜂鸟视图地图数据中台,全面提升商业地产的可视化信息管控
  3. Mac系统安装nginx+rtmp模块
  4. leetcode350C++
  5. php安装扩展步骤,PHP扩展安装方法步骤解析
  6. easypoi导入合并单元格_1分钟不到就能合并100个Excel工作表,这功能太强大了!...
  7. java创建gitlab账户_GitLab不会创建新的存储库
  8. python解数独--世界最难数独2.3秒完成_【数独】世界最难数独90+毫秒解决。一个不错的算法...
  9. c4d需要学哪几种语言,自学C4D要多久才能掌握.看下以下的总结
  10. 一个分块矩阵求逆矩阵的结论
  11. 微信小程序反编译wxss文件缺失_微信小程序反编译 wxss 丢失问题
  12. Python:同花顺全数据接口
  13. Qt Creator 运行LVGL模拟器
  14. 如何免费恢复电脑上误删除的视频
  15. 商业图表案例3-CO2排放量与人均GDP
  16. 用python写九九乘法表(用format格式极其简单)
  17. 108颗佛珠的含义,每颗佛珠都有含义
  18. C语言winmain函数的参数,c++:谁调用了main/WinMain函数!
  19. 赢在未来 | 升级营销模式,蚓链让企业业绩增长N倍
  20. Tyler and Strings(树状数组/排列组合/dp)

热门文章

  1. 【论文阅读笔记】MFRDet:A single-shot multi-level feature reused neural network for object detection
  2. 记录爬虫实战——有道翻译(反js加密)
  3. Activity onDestroy() 回调缓慢问题分析及完美解决方案
  4. QQ中的相关文件功能
  5. [hackthebox]shibboleth
  6. oc对mysql支持_iOS中数据库使用什么技术实现的
  7. Oracle错误:ORA-01400
  8. Windows下PHPStudy服务环境80端口被进程System占用的解决方法
  9. 再读德鲁克#2 如何提升生产率
  10. 使用axios发送get和post请求