C 言語で strdup 関数を使用する

胡金庫 2023年10月12日
  1. 関数 strdup を使って C 言語で与えられた文字列を複製する
  2. 関数 strndup を使って C 言語で与えられた文字列を複製する
  3. 関数 strdupa を用いて与えられた文字列を C 言語で複製する
C 言語で strdup 関数を使用する

この記事では、C 言語で strdup 関数を使用する方法をいくつか説明します。

関数 strdup を使って C 言語で与えられた文字列を複製する

strdup は、ほとんどの UNIX ベースのオペレーティングシステムで利用できる POSIX 準拠の関数の一つです。これは文字列コピー機能を実装しているが、内部的にメモリの割り当てとチェックを行う。ただし、strdupmalloc 関数呼び出しでメモリを確保するので、返された char ポインタを解放するのはユーザの責任です。

strdup は単一の引数、つまり複製元の文字列を受け取り、新たに複製された文字列へのポインタを返します。この関数は失敗した場合、つまり確保するメモリが不足している場合に NULL を返します。今回は、環境変数 HOMEgetenv 関数で取得し、その値を 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 コンパイラでは利用できないかもしれません。strdupastrdup 関数に似ているが、メモリの割り当てに 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C String