strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst, const char* src, unsigned int len);
字符串拷贝函数strcpy作用将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。这个问题很多公司的笔试题都有出现。
sprintf,snprintf都是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf和snprintf的区别是sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。而snprintf对于长度可控。
但是,无论是sprintf还是snprintf,格式化字符串的时候,都是使用'\0'作为格式化结束符号,例如
char buf[1024];
char *a="hello\0world";
int b = 10;
sprintf(buf, "%s%d",a,b);
格式化后buf的内容为hello10,二不是hello\0world10,这是因为\0是一个字符串结束符号。
在特定情况下,如果我们想格式化后的内容为hello\0world10的话,就要使用到内存拷贝函数了。
memcpy(buf, a, 11);//拷贝11个字节
sprintf(buf+11, "%d",b); //从buf的第十一位开始,不加11的话又复制到第一位了,覆盖了hello中的前几位
接着格式化一个整型,就可以得到想要的数据了。
PS:上面的问题导致了在一个项目中出现了一个Bug,所以现在记录下,以后留神点。= =
该项目中是这样的(简化了很多事情)
int a = 1234567890;//如果是使用字符串显示的话,需要11个字节存储
因为某种原因,现在要把a的内容格式化到一个4个字节的char的字符串a中,然后再作为子字符串,格式化到另外一个字符串中去。这时候可能会出现上面的问题。因为整型和字符串内部的存储方式不一致,可能在整型转化为字符串的过程中会出现一些问题,例如上面说的hello\0world这种结束符号的问题。。需要注意
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论