昨天仙兒去面試,告訴我他被問到這樣乙個題目。很遺憾儘管這兩個函式是如此簡單常用,而我也回答錯了。換句話說如果我去回答我也會被鄙視的。我以為既然有人這樣問,那麼可能在記憶體重疊時可能會不一樣,然而我回去查了下 msdn 發現兩者對於記憶體重疊都是未定義行為,所以記憶體重疊時應該使用 memmove,而不是 memcpy。
那麼兩者的區別在**呢,首先我們忽略引數的型別差別(前者明確要求 char*,後者無要求),因為這個差別非常的無關緊要。答案就是:當拷貝的位元組數小於等於字串長度時,兩者的結果是等效的。
但當拷貝的位元組數大於字串長度時,strncpy 是用 0 去補齊位元組數,而不是取自於 source。而 memcpy 呢,顯然是完全不 care 它拷貝是什麼內容的。
下面我可以通過一段測試**給出直觀的對比:
#include
#include
void printbytes(char *s, int count)
}int _tmain(int argc, _tchar* argv)
當然了,上面的準備 src 的那兩行**也可以這樣寫:
strcpy(src, "abcdefgh");
src[3] = 0;
**輸出如下(紅色數字標記出了兩者的行為差異):
strncpy:
61 62 63 00 00 00 00 00
memcpy:
61 62 63 00 64 65 66 67
可以注意到 strncpy 是需要關注字串的內容的,所以一旦遇到0以後,後面被拷貝的位元組就全部是 0。而 memcpy 是不關注被拷貝的內容是什麼的,因此從這個角度來說,無論如何,memcpy 都會比 strncpy 高效一點。
最後我們還需要特別提一點別的,strncpy 在被拷貝的位元組數小於字串長度時,是不負責在結尾新增 null-terminator 字元的,所以這時候字串可能沒有結尾。另外兩者對於記憶體重疊都沒有做考慮。當 dest 的位址稍微小於 src 的位址時,可能不會出現問題。當 dest 稍微大於 src 時,因為src 可能被覆蓋,所以導致結果有問題。
你不能抱怨面試者為什麼要出這樣乙個問題,即使你平時已經無數次的使用過這兩個基本的函式。然而如果你不能給出正確回答,那麼結論就是,你對這樣基本的函式例如 strncpy 的了解不夠徹底導致的。所以歸結於自己的問題。
昨天和火車上的乙個說英語的中國人(他的母親是中國人)聊了一路乙個多小時的英文,哈哈,這還是我第一次在生活中用英文和別人對話這麼長時間。我發現很多很簡單的單詞我當時居然沒有想起來,直到事後我才反應過來,因為當你對話時,你是沒時間停下來思考這些最簡單的單詞是什麼的,就好像大腦短路了。例如:
缺點:shortcoming;當時我用了flaw。
目的:aim;當時我用了purpose。
原則:principle。
術語:terminology,這個詞我都忘了怎麼拼了,是臨時查字典查的。
自大:這個詞我不知道用什麼單詞。
這些都是我事後才想起來,當時想提到這些時居然會卡殼。。。我們從簡體正體中文聊到技術(因為我知道對方不是技術人員,所以我其實克制了自己在技術方面去展開,只是給他講到了 c++ 是學習起來比較難的一門語言,以及**可讀性和執行效率之間的關係)聊到中國的問題,聊到房價,租房,政治等等,同時我也給他普及了諸如」80後「,」屌絲「,」富二代「這些術語。他還誇獎我說我的英文在中國人中比較少見的說的比較流利。這次經歷主要是對於我說英文是個鼓勵,另外也更加讓我認識到要繼續提高詞彙量的重要性
memcpy strcpy和strncpy的簡介
在c的操作中,對陣列類資料進行批量賦值一般通過memcpy strcpy和strncpy這三種函式進行,這裡將為其進行介紹.這三者的區別在於strcpy和strncpy只能對字串的資料進行拷貝,無法用於拷貝中間含有null的資料。函式的標頭檔案 string.h 1.memcpy 函式名 void ...
strcpy和strncpy的區別
strcpy 原型 char strcpy char restrict s1,const char restrict s2 用法 include 功能 把s2所指由null結束的字串複製到s1所指的陣列中。說明 s1和s2所指記憶體區域不可以重疊且s1必須有足夠的空間來容納s2的字串。返回指向s1的...
strcpy和strncpy的區別
第一種情況 1 2 3 4 char p how are you char name 20 abcdefghijklmnopqrs strcpy name,p name改變為 how are you 正確!strncpy name,p,sizeof name name改變為 how are you ...