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

【C言語】strncpy()関数とは?基本から実践的な使い方まで解説

strncpy()関数とは

C言語の標準ライブラリ関数 char *strncpy(char *dest, const char *src, size_t n) は、srcが指す文字列からdestへ最大n文字をコピーする関数です。もしsrcの長さがnより短い場合は、コピー後のdestの残りの領域がヌルバイト('\0')で埋められます。

なお、C言語において文字の配列は「文字列」と呼ばれます。


文字列の宣言

文字列(文字型配列)の宣言は以下のように行います。

char stringname[サイズ];

たとえば、char string[50];と記述すれば、最大50文字を格納できる文字列が宣言できます。

文字列の初期化

文字列の初期化には主に2つの方法があります。

1. 文字定数を使う方法

char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0'};

2. 文字列リテラル(定数)を使う方法

char string[10] = "Hello";

アクセス方法: 制御文字列「%s」を使用すると、文字列中の'\0'(NULL文字)に到達するまで文字列を読み取ることができます。

strncpy()関数の特徴

  • コピー元(ソース)の文字列から指定したn文字分を、コピー先(デスティネーション)の文字列へ複製します。

  • コピー先の文字列の長さは、コピー元の文字列と同じかそれ以上である必要があります。

構文は以下の通りです。

strncpy(コピー先の文字列, コピー元の文字列, n);

サンプルプログラム①:基本的なコピー

次はstrncpy()関数を使用した基本的なCプログラムです。

#include<string.h>
main ( ){
    char a[50], b[50];
    printf ("enter a string");
    gets (a);
    strncpy (b,a,3);
    b[3] = '\0';
    printf ("copied string = %s",b);
    getch ( );
}

実行結果

Enter a string : Hello
Copied string = Hel

このように、strncpy()関数は文字列の一部だけを抜き出す「部分文字列の抽出」にも活用できます。

サンプルプログラム②:部分文字列の抽出

次の例では、文字列の中間から任意の部分を取り出す方法を示しています。

char result[10], s1[15] = "Jan 10 2010";
strncpy (result, &s1[4], 2);
result[2] = '\0';

実行結果

Result = 10

ここでは、s1の5番目の要素(インデックス4)から2文字分をresultへコピーし、最後にNULL文字を付加することで「10」という部分文字列を取得しています。

サンプルプログラム③:複数箇所からの抽出と連結

続いて、strncpy()ライブラリ関数を使って、コピー元の文字列からn文字ずつ取り出して別の文字列にコピーするCプログラムを見てみましょう。

#include<stdio.h>
#include<string.h>
void main(){
    //コピー元とコピー先の文字列を宣言//
    char source[45],destination[50];
    char destination1[10],destination2[10],destination3[10],destination4[10];
    //ユーザーからコピー元の文字列を入力//
    printf("Enter the source string :");
    gets(source);
    //strncpyを使って新しい文字列を抽出//
    strncpy(destination1,source,2);
    printf("The first destination value is : ");
    destination1[2]='\0';//出力前に必ずNULL文字を代入しないとゴミ値が表示される//
    puts(destination1);
    strncpy(destination2,&source[8],1);
    printf("The second destination value is : ");
    destination2[1]='\0';
    puts(destination2);
    strncpy(destination3,&source[12],1);
    printf("The third destination value is : ");
    destination3[1]='\0';
    puts(destination3);
    //上記の結果をすべて連結//
    strcat(destination1,destination2);
    strcat(destination1,destination3);
    printf("The modified destination string :");
    printf("%s3",destination1);
}

実行結果

Enter the source string :Tutorials Point
The first destination value is : Tu
The second destination value is : s
The third destination value is : i
The modified destination string :Tusi3

注意点:NULL文字の手動追加

strncpy()関数を使用する際の重要なポイントとして、コピーした文字数がn未満の場合以外では自動的にNULL文字が付与されないことが挙げられます。そのため、上記のサンプルコードのように出力前に必ず手動でNULL文字('\0')を設定する必要があります。これを怠ると、バッファ内の不定なデータ(ゴミ値)まで表示されてしまい、予期しない動作やセキュリティ上の問題につながる可能性があります。

  1. C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説

    C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1

  2. C言語のstrcpy()関数とは?基本構文と使い方をわかりやすく解説

    C言語のライブラリ関数 char *strcpy(char *dest, const char *src) は、src が指し示す文字列を dest にコピーするための関数です。 C言語では、文字の配列のことを「文字列」と呼びます。 文字列の宣言 文字列(文字配列)の宣言は、以下の形式で行います。 char stringname[size]; 例えば char string[50]; と宣言すると、最大50文字の文字列を格納できる配列が確保されます。 文字列の初期化 文字列の初期化には、主に以下の2つの方法があります。 1. 文字定数を使う方法 char string[10] = {H,