1.首先兩個函式的引數不同,所以功能不是完全相同。strncpy()比strcpy()多乙個引數n,表示拷貝前n個字元。而strcpy()則是拷貝全部字元。
2.因為strncpy中有引數n的存在,所以它只負責複製前n個字元,沒複製字串結尾的標記』\0『。strcpy()則複製了』\0『。
3.兩者的錯誤處理,當strncpy()中規定複製的長度n大於目標的長度時會直接報錯;strcpy()如果目標的長度小於原長度的話則是能複製多少複製多少。
char* strcpy(char *dest, const char *src)
if(src==null)
return null;
while(*src!='\0')
*dest++=*src++;
*dest='\0';
return dest;
char* strncpy(char *dest, const char *src,int n)
if(src==null)
return null;
while(n&&(*dest++=*src++;*dest++=*src++))
n--;
if (count)
while (--count)
*dest++ = '\0';
return(start);
return dest;
沒什麼實際意義,為了方便函式呼叫設計,就比如int len=strlen(strcpy(arr,"hello word"));
否則就需要:
int *arr;
strcpy(arr,"hello word");
int n=strlen(arr);
比起這三行**還是那一行畢竟省事,這個也叫鏈式表示式。只是為了方便,僅此而已
兩者都不安全,strcpy()中當目標陣列的長度小於原來陣列的長度進行拷貝時會造成棧溢位,可能會修改其它記憶體的內容;strncpy()沒有提供遇null終止,而是一直找』\0『所以當目標陣列很小但n值很大就不安全.還有就是目標陣列很大,n比原始陣列的長度大時,會把目標陣列的多餘部分全部賦值成』\0『
解決:最後使用strnpy_s函式,該函式在strncpy()的基礎上還多了乙個引數,該引數表示是目標陣列的位元組大小,可以解決目標陣列空間不夠的問題,返回值也是返回的錯誤**而不是char*
strcpy和memcpy,memmove的區別
strcpy和memcpy都是標準c庫函式,它們有下面的特點。strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。已知strcpy函式的原型是 char strcpy char dest,const char src memcpy提供了一般記...
關於strcpy原始碼分析
注意到乙個帖子 strdest strsrc 0 哪兒前輩可以解釋下裡面具體執行的步驟呢?對於這樣的表示式,我們通常會有這樣三種看法 1.這種寫法不但沒有錯誤 當然也沒有bug 而且寫法緊湊。2.這種寫法雖然沒有錯誤,但是不夠直觀,理解起來有點麻煩,可能還會導致理解錯誤。3.這種寫法中存在未定義的地...
安全問題 VS中strcpy和strcpy s
strcpy this function or variable may be unsafe.consider using strcpy s instead.在vs中strcpy安全性較低,所以微軟提供了strcpy s來代替。1.在main函式前面新增一條預處理指令 pragma warning ...