使用 C 語言中的 strdup 函式

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