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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章