memcpy()函數
- 概要
原型 |
|
功能 | memcpy()會復制 src 所指的內存內容的前 num 個字節到 dest所指的內存地址上(memcpy()并不關心 被復制的數據類型,只是逐字節地進行復制,這給函數的使用帶來了很大的靈活性,可以面向任何數據 類型進行復制) |
注意 | 1.dest 指針要分配足夠的空間,也即大于等于 num字節的空間。 3.memcpy拷貝結束后不會給dest末尾添加‘/0’
src的長度都不會阻止),在vs2022會報警告。 |
返回值 | 返回指向 dest 的指針。注意返回的指針類型是void*,使用時一般要進行強制類型轉換。 |
- 舉個例子
int main()
{const char* p1 = "HEllO";char* p2 = (char*)malloc(sizeof(char) * 10);char* p3 = (char*)memcpy(p2, p1, 6);cout << p3 << endl;
}
?memmove函數
- ?概要
原型 |
|
功能 | memmove()會復制 src 所指的內存內容的前 num 個字節到 dest所指的內存地址上 |
注意 | 1.memmove() 更為靈活,當src 和 dest所指的內存區域重疊時,memmove() 仍然可以正確的處理, 不過執行效率上會比使用 memcpy()略慢些。(處理方式就是如果src長度小于dest,就從頭開始復制 ,如果src長度大于dest,就從后往前復制,這樣就可以保證內存區域重疊時正確復制) 2.memmove的特性基本上和memcpy一致。 |
返回值 | 返回指向 dest 的指針。注意返回的指針類型是void,使用時一般要進行強制類型轉換 |
- 舉個例子
int main()
{char str[] = "memmove can be very useful......";memmove(str + 20, str + 15, 11);puts(str);return 0;
}
strcpy()函數
- 概要
原型 |
|
功能 | strcpy() 把src所指的由"/0"結束的字符串復制到dest 所指的數組中,返回指向dest 字符串的起始地址 (連同"/0") |
注意 | 1.如果參數 dest 所指的內存空間不夠大,可能會造成緩沖溢出(bufferOverflow)的錯誤情況,在編寫 程序時需要特別留意,或者用strncpy()來取代
崩潰 |
返回值 | 指向dest 字符串的起始地址 |
?
- 舉個例子?
int main()
{char str1[] = "Sample string";char str2[8];char str3[40];strcpy(str2, str1);strcpy(str3, "copy successful");printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);return 0;}
strncpy()函數
- 概要
原型 |
|
功能 | ?strncpy()會將字符串src前n個字符拷貝到字符串dest,n也表示最多復制n個字符。 |
注意 | 1.不像strcpy(),strncpy()不會向dest追加結束標記'\0',這就引發了很多不合常理的問題。 2.如果n大于src的長度,會用"/0"填充dest。 |
返回值 | 指向dest 字符串的起始地址 |
- 舉個例子
int main(void)
{char dest3[100] = "xxxxxxxxxxxxxxxxxxxxxxxxx";const char src3[6] = "abcxy";int n3 = 20;strncpy(dest3, src3, n3); return 0;
}