使用 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 编译器中可能无法使用。strdupa 与 strdup 函数类似,只是它使用 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
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: Jinku Hu
