C 言語で strdup 関数を使用する
-
関数
strdup
を使って C 言語で与えられた文字列を複製する -
関数
strndup
を使って C 言語で与えられた文字列を複製する -
関数
strdupa
を用いて与えられた文字列を C 言語で複製する
この記事では、C 言語で strdup
関数を使用する方法をいくつか説明します。
関数 strdup
を使って C 言語で与えられた文字列を複製する
strdup
は、ほとんどの UNIX ベースのオペレーティングシステムで利用できる POSIX 準拠の関数の一つです。これは文字列コピー機能を実装しているが、内部的にメモリの割り当てとチェックを行う。ただし、strdup
は malloc
関数呼び出しでメモリを確保するので、返された char
ポインタを解放するのはユーザの責任です。
strdup
は単一の引数、つまり複製元の文字列を受け取り、新たに複製された文字列へのポインタを返します。この関数は失敗した場合、つまり確保するメモリが不足している場合に NULL
を返します。今回は、環境変数 HOME
を getenv
関数で取得し、その値を 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