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
