使用 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 编译器中可能无法使用。strdupa
与 strdup
函数类似,只是它使用 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
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