C 語言中複製字元陣列

Jinku Hu 2023年1月30日 2021年2月28日
  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 <stdlib.h>
#include <string.h>
#include <stdio.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 <stdlib.h>
#include <string.h>
#include <stdio.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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Array