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

C言語のstrncat()関数とは?指定した文字数だけ文字列を連結する方法を解説

C言語の標準ライブラリ関数 char *strncat(char *dest, const char *src, size_t n) は、srcが指し示す文字列の先頭から最大n文字を取り出し、destが指し示す文字列の末尾に連結(追加)するための関数です。

なお、C言語では文字型(char型)の配列のことを「文字列」と呼びます。

文字列の宣言

文字列(char型配列)は、次の形式で宣言します。

char 文字列名[サイズ];

たとえば「char string[50];」と記述すれば、50文字分の長さを持つ文字列が確保されます。

文字列の初期化

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

  • 1文字ずつ文字定数で初期化する場合:
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
  • 文字列リテラル(文字列定数)で初期化する場合:
char string[10] = "Hello";

文字列へのアクセス

文字列の入出力には、変換指定子(制御文字列)である「%s」を使用します。「%s」は、終端を表すヌル文字「'\0'」に到達するまで文字列を扱います。

strncat()関数のポイント

  • ある文字列(連結元)の先頭からn文字だけを、別の文字列(連結先)に結合するために使います。

  • 連結先の配列には、「元の文字列+連結されるn文字+終端のヌル文字」がすべて収まるだけの十分なサイズが必要です。

  • 連結結果は、第1引数に指定した連結先の文字列に格納されます。

構文は次のとおりです。

strncat(連結先の文字列, 連結元の文字列, n);

使用例1:先頭4文字を連結する

次のプログラムは、strncat()関数を使って文字列bの先頭4文字を文字列aに連結する例です。

#include <string.h>
main ( ){
    char a[30] = "Hello \n";
    char b[20] = "Good Morning \n";
    strncat(a, b, 4);
    a[9] = '\0';
    printf("concatenated string = %s", a);
}

実行結果

Concatenated string = Hello Good.

この例では、strncat(a, b, 4)によって「Good Morning」の先頭4文字「Good」がaの末尾に追加され、続く a[9] = '\0'; の代入により文字列の終端位置が調整されます。

使用例2:ユーザー入力を連結する

続いて、キーボードから入力した文字列に対してstrncat()関数を適用するCプログラムの例を見てみましょう。

#include<stdio.h>
#include<string.h>
void main(){
    // コピー元とコピー先の文字列を宣言 //
    char source[45], destination[50];
    // コピー元とコピー先の文字列をユーザーに入力してもらう //
    printf("Enter the source string :");
    gets(source);
    printf("Enter the destination string before :");
    gets(destination);
    // 上記の結果をもとに連結を行う //
    destination[2] = '\0';
    strncat(destination, source, 2);
    strncat(destination, &source[4], 1);
    // 変更後のコピー先の文字列を表示 //
    printf("The modified destination string :");
    puts(destination);
}

実行結果

Enter the source string :Tutorials Point
Enter the destination string before :Tutorials Point C Programming
The modified destination string :TuTur

プログラムの処理の流れ

この例では、まず destination[2] = '\0'; によってコピー先の文字列を「Tu」まで切り詰めます。次に strncat(destination, source, 2) でコピー元の先頭2文字「Tu」を連結し、さらに strncat(destination, &source[4], 1) でコピー元の5文字目以降(&source[4]が指す位置)から1文字「r」を連結します。その結果、最終的な出力は「TuTur」となります。

注意点

  • strncat()は、最大n文字を連結した後に必ずヌル文字「'\0'」を付加します。そのため、連結先のバッファには「元の文字列の長さ + n + 1」バイト以上の領域を用意してください。

  • サンプルで使用している gets() 関数は、バッファオーバーフローを引き起こす危険があるため、現在のC標準規格では削除されています。実際の開発では fgets() など安全な代替関数を使用しましょう。

  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,