Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C/C++】strdup()とstrndup()で文字列を複製する方法を徹底解説

strdup()関数とは

strdup()関数は、文字列を複製(コピー)するために使用される関数です。引数として渡された文字列と同じ内容の新しいメモリ領域を確保し、NULL終端されたバイト文字列へのポインタを返します。

なお、strdup()はPOSIXで定義されている関数であり、厳密にはC標準ライブラリには含まれません。内部ではmalloc()を使ってメモリを動的に確保するため、使い終わったらfree()で解放する必要がある点に注意しましょう。また、メモリ確保に失敗した場合はNULLが返されます。

C言語におけるstrdup()の構文は以下の通りです。

char *strdup(const char *string);

サンプルプログラム

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    char *str = "Helloworld";
    char *result;

    result = strdup(str);
    if (result == NULL) {
        return 1; /* メモリ確保失敗 */
    }
    printf("複製した文字列 : %s\n", result);

    free(result);
    return 0;
}

実行結果

複製した文字列 : Helloworld

このように、元の文字列strとまったく同じ内容の新しい文字列が生成され、その先頭アドレスがresultに格納されます。

strndup()関数とは

strndup()関数は、strdup()とよく似た動作をする関数です。違いは、最大で第2引数sizeに指定したバイト数までしか文字列を複製しないという点です。元の文字列が指定サイズより長い場合は、先頭からsizeバイト分だけがコピーされ、末尾にNULL文字が付加されます。戻り値もNULL終端されたバイト文字列へのポインタです。

C言語におけるstrndup()の構文は以下の通りです。

char *strndup(const char *string, size_t size);

サンプルプログラム

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    char *str = "Helloworld";
    char *result;

    result = strndup(str, 3);
    if (result == NULL) {
        return 1; /* メモリ確保失敗 */
    }
    printf("複製した文字列 : %s\n", result);

    free(result);
    return 0;
}

実行結果

複製した文字列 : Hel

この例では、10文字の文字列「Helloworld」に対してサイズとして3を指定しているため、先頭の3文字「Hel」のみが複製されています。

まとめ

  • strdup():文字列全体を複製したい場合に使用する。
  • strndup():先頭から指定バイト数だけ複製したい場合に使用する。
  • どちらの関数も内部でメモリを動的に確保するため、不要になったら必ずfree()で解放すること。
  • メモリ確保に失敗するとNULLが返るため、戻り値のチェックを忘れないこと。
  1. C/C++で文字列を反転する方法をサンプルコード付きで解説

    C言語で文字列を反転(逆順に並べ替え)する方法を、実際のコード例とともにわかりやすく解説します。サンプルコード#include<stdio.h> #include<string.h> int main() {     char s[50], t;     int i = 0, j = 0;     printf(\nEnter the string to reverse :);     gets(s); &

  2. C++のstrncat()関数とは?文字列連結の基本をわかりやすく解説

    strncat()関数とはC++のstrncat()関数は、文字列を連結するために使用される関数です。コピー元の文字列(src)から指定した文字数だけを、コピー先の文字列(dest)の末尾に追加し、コピー先の文字列へのポインタを返します。この関数を使用するには、ヘッダーファイル<cstring>をインクルードする必要があります。strncat()の構文char * strncat ( char * dest, const char * src, size_t num );上記の構文では、コピー元の文字列srcは、最大num文字までコピー先の文字列destの末尾に追加されます。追加処