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