天天看点

strcpy, strncpy, strcat, strncat, sprintf, snprintf等常用函数

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'结尾。