天天看點

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