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);
功能
(c/c++)復制字符串src中的內容(字符,數字、漢字....)到字符串dest中,復制多少由size_tn的值決定。如果src的前n個字符不含NULL字符,則結果不會以NULL字符結束。
如果n<src的長度,只是將src的前n個字符復制到dest的前n個字符,不自動添加'\0',也就是結果dest不包括'\0',需要再手動添加一個'\0'。如果src的長度小於n個字節,則以NULL填充dest直到復制完n個字節。src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符長度+'\0'。舉例:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { char name[]={"Chinanet"},dest[20]={}; 5 strncpy(dest,name,3); 6 dest[3]='\0';//沒有會亂碼 7 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[20]={0};
strncpy(dest,name,9);
printf("%s\n",dest);
strncpy可實現strcpy的字符串復制:
char name[]="Chinanet",dest[20]={0};
strncpy(dest,name,sizeof(name));
printf("%s\n",dest);