關於strcpy和strncpy的面試題

問題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*

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章