問題1:strcpy()和strncpy()的區別
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;
}
問題2:爲什麼返回dest副本
沒什麼實際意義,爲了方便函數調用設計,就比如int len=strlen(strcpy(arr,"hello word"));
否則就需要:
int *arr;
strcpy(arr,"hello word");
int n=strlen(arr);
比起這三行代碼還是那一行畢竟省事,這個也叫鏈式表達式。只是爲了方便,僅此而已
問題3:兩個函數的缺陷,如何解決
兩者都不安全,strcpy()中當目標數組的長度小於原來數組的長度進行拷貝時會造成棧溢出,可能會修改其它內存的內容;strncpy()沒有提供遇NULL終止,而是一直找’\0‘所以當目標數組很小但n值很大就不安全.還有就是目標數組很大,n比原始數組的長度大時,會把目標數組的多餘部分全部賦值成’\0‘
解決:最後使用strnpy_s函數,該函數在strncpy()的基礎上還多了一個參數,該參數表示是目標數組的字節大小,可以解決目標數組空間不夠的問題,返回值也是返回的錯誤代碼而不是char*