使用 C 語言中的 strdup 函式

Jinku Hu 2023年10月12日
  1. 在 C 語言中使用 strdup 函式複製給定的字串
  2. 使用 strndup 函式在 C 語言中複製給定的字串
  3. 使用 strdupa 函式用 C 語言複製給定的字串
使用 C 語言中的 strdup 函式

本文將介紹幾種在 C 語言中使用 strdup 函式的方法。

在 C 語言中使用 strdup 函式複製給定的字串

strdup 是 POSIX 相容函式之一,在大多數基於 UNIX 的作業系統上都可以使用。它實現了字串複製功能,但在內部進行記憶體分配和檢查。雖然使用者有責任釋放返回的 char 指標,因為 strdup 是通過 malloc 函式呼叫來分配記憶體的。

strdup 接受一個引數-要複製的源字串,並返回一個新複製的字串的指標。該函式在失敗時返回 NULL,即當沒有足夠的記憶體分配時。在本例中,我們使用 getenv 函式檢索 HOME 環境變數,並使用 strdup 複製其值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *path = NULL;

  const char *temp = getenv("HOME");

  if (temp != NULL) {
    path = strdup(temp);

    if (path == NULL) {
      perror("strdup");
      exit(EXIT_FAILURE);
    }

  } else {
    fprintf(stderr, "$HOME environment variable is not defined\n");
    exit(EXIT_FAILURE);
  }

  printf("%s\n", path);
  free(path);

  exit(EXIT_SUCCESS);
}

輸出:

/home/user

使用 strndup 函式在 C 語言中複製給定的字串

strndup 是一個類似的函式,它需要一個額外的引數來指定最多需要複製的位元組數。這個版本只對複製字串的某些部分有用。但請注意,strndup 會在複製的字元上新增終止的空位元組,從而確保它以 C-風格的字串格式儲存,並能被如此操作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *path = NULL;

  const char *temp = getenv("HOME");

  if (temp != NULL) {
    path = strndup(temp, 5);

    if (path == NULL) {
      perror("strdup");
      exit(EXIT_FAILURE);
    }

  } else {
    fprintf(stderr, "$HOME environment variable is not defined\n");
    exit(EXIT_FAILURE);
  }

  printf("%s\n", path);
  free(path);

  exit(EXIT_SUCCESS);
}

輸出:

/home

使用 strdupa 函式用 C 語言複製給定的字串

strdupa 是 GNU C 庫的一部分,在其他 C 編譯器中可能無法使用。strdupastrdup 函式類似,只是它使用 alloca 進行記憶體分配。alloca 函式在堆疊區域實現記憶體分配,當呼叫函式返回時,該區域會自動釋放。因此,從 strdupa 返回的指標不應該用 free 呼叫來顯式釋放,否則會導致分段故障。需要注意的是,應該定義 _GNU_SOURCE 巨集才能成功編譯程式碼。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *path = NULL;

  const char *temp = getenv("HOME");

  if (temp != NULL) {
    path = strdupa(temp);

    if (path == NULL) {
      perror("strdup");
      exit(EXIT_FAILURE);
    }

  } else {
    fprintf(stderr, "$HOME environment variable is not defined\n");
    exit(EXIT_FAILURE);
  }

  printf("%s\n", path);

  exit(EXIT_SUCCESS);
}

輸出:

/home/user
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

LinkedIn Facebook

相關文章 - C String