strcpy:
函数原型:char *strcpy(char* dest, const char *src);
使用建议:非常不安全的函数,第二个参数src遇到'\0'才会停止复制,dest太小就可能会内存操作越界;
strncpy:
函数原型:char *strncpy(char *dest,char *src,size_t n);
使用建议:较安全的函数,正好向dest复制n个字节;
若strlen(src)的长度小于n,n小于dest的空间,则不满n的长度填充'\0';
若strlen(src)的长度大于等于n,则直接复制n个字符,不自动在dest的n个字节后填充NULL;
综上所述,strncpy只操作n个字节的空间。
安全的使用方法:
在使用strncpy之前清零dest(memset等其他方式),使用时strncpy(dest, src, size-1);(size为dest空间大小);
如果在使用strncpy之前不能判断dest是否清零,则一般需要在strncpy(dest, src, size-1);后使用dest[size-1] = '\0';
strcat:
函数原型:char *strcat(char *dest, const char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'.
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串.函数返回值:返回指向dest的指针。
使用建议:非常不安全的函数,dest必须有足够的空间容纳src的长度,并能在后面有空间填充'\0'。
strncat:
函数原型:char * strncat(char *dest, const char *src, size_t n);
把src所指字符串前n个字符添加添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'.
若追加的src长度少于n,则只追加src的长度并添加'\0'.
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串.函数返回值:返回指向dest的指针。
使用建议:较安全的函数,最多向dest复制n个字节,并在字符串复制结束后在后面填充'\0'。
sprintf:
函数原型:int sprintf( char *buffer, const char *format, [ argument] … );
使用建议:非常不安全的函数,直接复制指定的字符串到buffer,不判断内存是否越界操作。返回的是实际格式化的字节数。
snprintf:
函数原型:int snprintf(char *str, size_t size, const char *format, ...);
使用建议:较安全的函数,最多复制size-1个字节到str,并将str[size-1]置为'\0';如果复制的字符串的长度小于str的空间,则在复制strlen(源字符串)后添加加'\0';返回的欲格式化输出的字节数。如果size的大小超过str的大小,那么复制完size-1个字节后,还是会在后面强制加上'\0'。
安全的使用方法:在使用snprintf之前清零dest(memset等其他方式),使用时snprintf(str,str_size,format, ......);(size为str空间大小);
memcpy:
函数原型:void *memcpy(void *dest, const void *src, size_t n);
使用建议:内存区域如果重叠,其结果是位定义的。
memmove:
函数原型:void *memmove( void* dest, const void* src, size_t count );
使用建议:内存区域可以重叠,一定是成功的内存拷贝。
strcmp:
函数原型:
int
strcmp
(
const
char
*s1,
const
char
*s2);
使用建议:比较的字符串必须以'\0'结尾,否则将内存越界比较。
strncmp:
函数原型:int strncmp ( const char * str1, const char * str2, size_t n );
使用建议:仅仅只比较n个字节,并不要求比较的字符串一定以'\0'结尾。