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