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