複製鏈接
請複製以下鏈接發送給好友

strncpy

鎖定
strncpy函數用於將指定長度的字符串複製到字符數組中,是 C語言的庫函數之一,來自 C語言標準庫,定義於 string.h。語法形式為:char *strncpy(char *dest, const char *src, int n),表示把src所指向的字符串中以src地址開始的前n個字節複製到dest所指的數組中,並返回被複制後的dest。 [1-2] 
外文名
strncpy
頭文件
string.h
功    能
串拷貝

strncpystrncpy基本格式

strncpy語法

char *strncpy(char *destinin, char *source, int maxlen);

strncpy參數

destinin:表示複製的目標字符數組;
source:表示複製的源字符數組;
maxlen:表示複製的字符串長度。 [3] 

strncpy功能

strncpy功能講解

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

strncpy功能概括

簡而言之,就是把source指向的字符串的前size_t n個字符(不包括\0,\0得自己手動加在*destin被複制之後)複製到destin指向的字符串中。如果要複製的*source的部分有\0,就把\0複製進去,之後就提前結束,即使沒複製到第size_t n個字符也是。返回指向*destin的指針。

strncpy區別

strcpy只是複製字符串,但不限制複製的數量,很容易造成緩衝溢出。strncpy要安全一些。 [3] 
strncpy能夠選擇一段字符輸出,strcpy則不能。例如:
char name[]="Chinanet",destin[20]={0};
strncpy(destin,name,9);
printf("%s\n",destin);
strncpy可實現strcpy的字符串複製:
char name[]="Chinanet",destin[20]={0};
strncpy(destin,name,sizeof(name));
printf("%s\n",destin);
參考資料
  • 1.    譚浩強 . C程序設計(第4版): 清華大學出版社, 2010.6
  • 2.    張權 .Objective-C函數速查實例手冊 :人民郵電出版社 ,2014.2
  • 3.    尹德淳.C函數速查手冊 : 人民郵電出版社,2009.4
  • 4.    陳超.C語言常用函數速查手冊: 化學工業出版社 ,2010.6