使用 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