C에서 strdup 함수 사용
이 기사에서는 C에서strdup
기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.
strdup
함수를 사용하여 C에서 주어진 문자열 복제
strdup
은 대부분의 UNIX 기반 운영 체제에서 사용할 수있는 POSIX 호환 기능 중 하나입니다. 문자열 복사 기능을 구현하지만 내부적으로 메모리 할당 및 검사를 수행합니다. 사용자는strdup
이malloc
함수 호출로 메모리를 할당하기 때문에 반환 된char
포인터를 해제해야합니다.
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
는 메모리 할당에alloca
를 사용한다는 점을 제외하면strdup
함수와 유사합니다. 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
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 Facebook