C 語言中複製字元陣列

Jinku Hu 2023年10月12日
  1. 使用 memcpy 函式在 C 語言中複製一個字元陣列
  2. 使用 memmove 函式在 C 語言中複製一個字元陣列
C 語言中複製字元陣列

本文將演示關於如何在 C 語言中複製一個字元陣列的多種方法。

使用 memcpy 函式在 C 語言中複製一個字元陣列

char 陣列可能是 C 程式碼中最常用的資料結構,複製陣列內容是它的核心操作之一。C 式字串與 char 陣列非常相似,因此,有多種方法可以處理複製陣列內容。在下面的例子中,我們宣告瞭兩個陣列,arrarr2;前者用字元列表符號初始化,後者用字串文字化。注意,這將產生不同的陣列結構和大小。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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C Array