个人总结常用的相关API函数:
拷贝:strcpy,memcpy,sprintf;strncpy,_snprintf
合并:strcat,sprintf;strncat,_snprintf
比较:strcmp,memcmp;strncmp
这里我们只需要分析其中一类的相关函数,同时就可以了解其他类的函数了。
首先看看strcpy,memcpy,sprintf三个函数,这三个函数都可以用来进行字符串之间的拷贝操作。
strcpy::Copy a string.
函数原型::
char *strcpy(
char *strDestination,
const char *strSource
);
strcpy是拷贝字符串,以/0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)
memcpy::Copies bytes between buffers.
函数原型:
void *memcpy(
void *dest,
const void *src,
size_t count
);
而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字
符)
sprintf ::Write formatted data to a string.
函数原型:
int sprintf(
char *buffer,
const char *format [,
argument] ...
);
sprintf一个可以给定格式的字符串拷贝
然后我们看一下三个函数的区别:
strcpy只能处理字符串;如果拷贝带有特殊字符的串,就只能用memcpy或memmove。memcpy和memmove
功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。
另外char *strcpy() 跟 memcpy() 的区别在于当源地址和目标地址发生重叠时,前者是未定义的,
就依赖于编译器的,后者是先做了一份拷贝,最终是能正确实现的, 前者就不一定了
同时我们注意到,在这三个函数中,除了memcpy考虑到源字符串和目的字符串的拷贝长度以外,
strcpy和sprintf都是没有考虑到的,这样在使用的时候很有可能就会因为目的字符串的内存小于源
字符串的内存大小,这将会导致溢出,内存异常导致程序崩溃。
这时候我们就可以考虑到使用进行了长度限制的拷贝操作函数,那就是strncpy和_snprintf.
strncpy::Copy characters of one string to another.
函数原型:
char *strncpy(
char *strDest,
const char *strSource,
size_t count
);
_snprintf::Writes formatted data to a string.
函数原型:
int _snprintf(
char *buffer,
size_t count,
const char *format [,
argument] ...
);
当然,使用这两个函数只是可以保证控制了部分不必要的溢出错误,但是并不能保证拷贝成功,就像
上面strcpy和memcpy的分析,所以,如果需要拷贝字符串,尽量可以考虑使用memcpy
最后还可以看到,sprintf和_snprintf两个函数同时出现在了拷贝和合并字符串操作中,它们同事具
有了字符窜拷贝和合并的功能。在将多个源字符串格式化后合并入目的字符串中,如果目的字符串为
空,这时就相当于做了一次格式化的拷贝操作。