strcpy、strncpy、strncpy_s和snprintf
来源:互联网 发布:淘宝吴式太极拳械述真 编辑:程序博客网 时间:2024/04/29 04:44
1、strcpy
依据源串的\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 = 000000012345 i = snprintf(a, 9, "%012d", 12345); // 第 2 种情况 printf("i = %lu, a = %s\n", i, a); // 输出:i = 12, a = 00000001 return 0;}
- strcpy、strncpy、strncpy_s和snprintf
- strncpy,strncpy_s和strcpy,strcpy_s
- strcpy、 strncpy 和snprintf
- strcpy,strncpy和strncpy_s的区别
- strcpy,strncpy和strncpy_s的区别
- strcpy,strncpy和strncpy_s的区别
- strcpy,strncpy和strncpy_s的区别
- strcpy,strncpy和strncpy_s的区别
- strcpy()、strncpy()、strlcpy()、strncpy_s()函数
- strcpy ,strncpy ,strlcpy和snprintf的使用
- sprintf、snprintf、strcpy、strncpy
- strcpy,strncpy和strncpy_s的区别 strncpy函数与memcpy函数
- strcpy ,strncpy ,strlcpy, snprintf, memcpy 用法、区别和效率
- snprintf和strncpy对比
- strcpy/strncpy/sprintf/_snprintf/snprintf的区别
- strcat,strncat,strcpy,strncpy,snprintf,vsnprintf
- strcpy 和 strncpy
- strcpy和strncpy区别
- java实现简单的单点登录
- python 字典的get方法
- timus 1640. Circle of Winter URAL 解题报告 水题一枚,坑死多少英雄啊……
- php检测数据类型
- 技术人员如何创业
- strcpy、strncpy、strncpy_s和snprintf
- 【转】UltraEdit正则表达式介绍及实例
- Linq to sql :查询句法--join
- Mahout0.6-贝叶斯分类器对文本分类
- Uninstall Mindjet MindManager with WindowsUninstaller.Org Removal Tips
- cnComm类(串口类)的使用方法
- iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)
- ASP.NET MVC中权限控制的简单实现
- js冒泡法和数组转换成字符串