關於strcpy和strncpy的面試題

2021-10-07 18:39:55 字數 1154 閱讀 2261

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 ...