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