C 語言中複製字元陣列
本文將演示關於如何在 C 語言中複製一個字元陣列的多種方法。
使用 memcpy
函式在 C 語言中複製一個字元陣列
char
陣列可能是 C 程式碼中最常用的資料結構,複製陣列內容是它的核心操作之一。C 式字串與 char
陣列非常相似,因此,有多種方法可以處理複製陣列內容。在下面的例子中,我們宣告瞭兩個陣列,arr
和 arr2
;前者用字元列表符號初始化,後者用字串文字化。注意,這將產生不同的陣列結構和大小。arr
物件在記憶體中是 7 個字元,但 arr2
需要 17 個字元加上終止的空位元組,結果是一個 18 位元組的物件。因此,我們將 sizeof arr2 - 1
表示式的值作為第二個引數傳遞,表示陣列的長度。另一方面,我們可以使用 printf
函式和%s
格式指定符列印 arr2
陣列的內容。
當複製 char
陣列到不同的位置時,應該考慮同樣的細節。memcpy
函式是標準庫字串實用程式的一部分,定義在 <string.h>
標頭檔案中。它需要三個引數,第一個引數是目標指標,陣列的內容將被複制到那裡。第二個引數是指向源陣列的指標,最後一個引數指定要複製的位元組數。注意,sizeof
運算子返回的是以位元組為單位的 char
陣列物件大小。所以我們用 malloc
呼叫將 sizeof arr
表示式的值傳遞給它來分配動態記憶體。返回的記憶體區域足以容納 arr
的內容,我們不需要擔心緩衝區溢位的 bug。不過要注意的是,從 malloc
返回的指標應該被釋放。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
int main(int argc, char *argv[]) {
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
char arr2[] = "array initialized";
printf("%lu\n", sizeof arr);
printf("%lu\n", sizeof arr2);
printCharArray(arr, sizeof arr);
printCharArray(arr2, sizeof arr2 - 1);
char *str = malloc(sizeof arr);
memcpy(str, arr, sizeof arr);
printf("str: ");
printCharArray(str, sizeof arr);
free(str);
str = malloc(sizeof arr2);
memcpy(str, arr2, sizeof arr2);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
輸出:
7
18
a, b, c, d, e, f, g,
a, r, r, a, y, , i, n, i, t, i, a, l, i, z, e, d,
str: a, b, c, d, e, f, g,
str: array initialized
使用 memmove
函式在 C 語言中複製一個字元陣列
memmove
是標準庫字串實用程式中的另一個記憶體區域複製函式。它是作為一個更強大的函式實現的,以適應目標和源記憶體區域重疊的情況。memmove
引數與 memcpy
相同。
在複製 arr2
內容時,我們將 sizeof arr2
表示式作為第三個引數傳遞。這意味著即使是結束的空位元組也被複制到了目標指標上,但我們因此利用這個操作呼叫 printf
和%s
來輸出內容,而不是使用 printCharArray
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printCharArray(char *arr, size_t len) {
for (size_t i = 0; i < len; ++i) {
printf("%c, ", arr[i]);
}
printf("\n");
}
int main(int argc, char *argv[]) {
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
char arr2[] = "array initialized";
char *str = malloc(sizeof arr);
memmove(str, arr, sizeof arr);
printf("str: ");
printCharArray(str, sizeof arr);
free(str);
str = malloc(sizeof arr2);
memmove(str, arr2, sizeof arr2);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
輸出:
str: a, b, c, d, e, f, g,
str: array initialized