strncpy

將字元串複製到字元組中的函數

strncpy函數用於將指定長度的字元串複製到字元數組中,是 C語言的庫函數之一,來自C語言標準庫,定義於 string.h。語法形式為:char *strncpy(char *dest, const char *src, int n),表示把src所指向的字元串中以src地址開始的前n個位元組複製到dest所指的數組中,並返回被複制后的dest。

格式


函數原型char*strncpy(char*dest,char*src,size_tn);
語法
char *strncpy(char *destinin, char *source, int maxlen);
參數
destinin:表示複製的目標字元數組;
source:表示複製的源字元數組;
maxlen:表示複製的字元串長度。

功能


功能概括
簡而言之,就是把source指向的字元串的前size_t n個字元(不包括\0,\0得自己手動加在*destin被複制之後)複製到destin指向的字元串中。如果要複製的*source的部分有\0,就把\0複製進去,之後就提前結束,即使沒複製到第size_t n個字元也是。返回指向*destin的指針。
(c/c++)複製字元串src中的內容(字元,數字、漢字....)到字元串dest中,複製多少由size_tn的值決定。如果src的前n個位元組不含NULL字元,則結果不會以NULL字元結束。如果src的長度小於n個位元組,則以NULL填充dest直到複製完n個位元組。src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字元長度+'\0'。舉例:
#include
int main()
{ char name[]={"Chinanet"},dest={};
strncpy(dest,name,9);
printf("%s\n",dest); }
1)src串長度<=dest串長度,(這裡的串長度包含串尾NULL字元)
如果n>src由於長度達到src NULL,正常複製,特別注意,如果src中有NULL,strncpy複製到NULL即使沒到n也提前停止。如果n = src串長度,與strcpy一致。注意n的選擇當n > dest串長度,dest棧空間溢出產生崩潰異常。
2)src串長度>dest串長度
如果n =dest串長度,則dest串沒有NULL字元,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest 最後一字元置為NULL。
綜上,一般情況下,使用strncpy時,建議將n置為dest串長度(除非你將多個src串都複製到dest數組,並且從dest尾部反向操作),複製完畢后,為保險起見,將dest串最後一字元置NULL,避免發生在第2)種情況下的輸出亂碼問題。當然嘍,無論是strcpy還是strncpy,保證dest串容量(能容納下src串)才是最重要的。

區別


strcpy只是複製字元串,但不限制複製的數量,很容易造成緩衝溢出。strncpy要安全一些。
strncpy能夠選擇一段字元輸出,strcpy則不能。例如:
char name[]={"Chinanet"},dest={};
strncpy(dest,name,9);
printf("%s\n",dest);
strncpy可實現strcpy的字元串複製:
char name[]={"Chinanet"},dest={};
strncpy(dest,name,sizeof(name));
printf("%s\n",dest);