文字列を連結するために使用される標準Cライブラリ関数はstrcat()です。
関数プロトタイプ:
$char * strcat ((str1、str2)。;ここで、str1は最初の文字列、str2は2番目の文字列です。関数の戻り値は、連結された文字列へのポインタです。
ここで、例を使用して、連結がどのように実行されるかを確認します。
例1:
$ strcat ((str1、str2)。;ここでstr1はベラです
str2はホイットマンです
文字列の連結後、最初の文字列は
str1ベラホイットマン
str2ホイットマン
string2は同じままです。
例2:
$ strcat ((str2、str1)。;ここでstr1はベラです
str2はホイットマンです
文字列の連結後、連結された文字列は
str1ベラ
str2ベラホイットマン
string1は同じままです。
Cヘッダーファイルでの宣言
文字列処理関数は、headerfileの下で宣言されます。標準関数を使用して連結する場合は、このヘッダーファイルをインクルードする必要があります。
したがって、2つの方法で文字列の連結を実現できます。 1つは標準Cライブラリ関数を使用する場合と、もう1つはCライブラリ関数を使用しない場合です。以下は、両方の方法を示すためのサンプルプログラムです。 Cライブラリ関数を使用しない文字列連結は、複数の方法で実装できます。
これについても、次のセクションで例を挙げて説明します。
Cライブラリ関数を使用した2つの文字列の連結
#含む#含む
#define BUF_SIZE 256
int主要(()。
{{
charS1[BUF_SIZE]、S2[BUF_SIZE]; / * 2つの文字列バッファ* /
printf (('最初の文字列を入力しますNS')。; ] / *ユーザーが最初の文字列を入力できるようにコンソールにメッセージを出力します* /
fgets ((S1、BUF_SIZE、stdin)。; / *ユーザー入力文字列をS1バッファに保存します* /
S1[ strlen ((S1)。-1] = ' 0';
printf (('2番目の文字列を入力しますNS')。;/ * 2番目の文字列を入力するためのメッセージをユーザーに出力します* /
fgets ((S2、BUF_SIZE、stdin)。; / *ユーザー入力文字列をS2バッファに保存します* /
S2[ strlen ((S2)。-1] = ' 0';
strcat ((S1、S2)。; / * S1およびS2文字列を使用して標準関数を呼び出します* /
printf (('NS連結された文字列は%sですNSNS'、S1)。; / *出力:S1にS2が追加されます* /
戻る 0;
}
プログラムと出力のスナップショット:
ライブラリ関数を使用しない2つの文字列の連結
forループを使用して、最初の文字列の最後にある2番目の文字列をコピーします。
#含む#含む
#define BUF_SIZE 256
int主要(()。
{{
charS1[BUF_SIZE]、S2[BUF_SIZE]; / *両方の文字列のバッファS1、S2を宣言します* /
int長さ= 0、私、NS; / *ループトラバーサルに必要な変数* /
printf ((「最初の文字列を入力してください」)。; / *最初の文字列を入力するためのユーザーメッセージを出力します* /
fgets ((S1、BUF_SIZE、stdin)。; / *ユーザー入力文字列はS1に保存されます* /
S1[ strlen ((S1)。-1] = ' 0';
printf (('2番目の文字列を入力してください')。; / *ユーザーメッセージを出力して2番目の文字列を入力します* /
fgets ((S2、BUF_SIZE、stdin)。; / *ユーザー入力文字列はS2に保存されます* /
S2[ strlen ((S2)。-1] = ' 0';
/ *最初の文字列をトラバースしてS1の長さを見つけます* /
にとって((私=0;S1[私]!=' 0';私++)。
{{
長さ=長さ+1;
}
/ *長さはS1の終わりを持ち、長さから始まり、S2全体をS1にコピーします* /
にとって((私=長さ、NS=0;S2[NS]!=' 0';私++、NS++)。
{{
S1[私]=S2[NS];
S1[私]=' 0';
}
/ * S1を連結した結果を出力します* /
printf (('NS連結された文字列は%sですNSNS'、S1)。;
戻る 0;
}
プログラムと出力のスナップショット:
ライブラリ関数なしの別の方法
再帰を使用した連結:
stringconcatenate()関数は、string1の長さを取得するために使用されます。 S2が空の場合、ヌル文字がS2に割り当てられます。
S1の最後にS1 [i + j] = S2 [j]であるS2の要素を追加するよりもS2にヌル文字が割り当てられていない場合、これにより文字列内のiの値が増加します。
関数は、リフォームされた文字列(S1、S2)を引数として渡すことによって呼び出されます。 S2が空になるまで何度も呼び出されます。
連結されたS1は、main()によって次のように出力されます。
#含む#含む
#define BUF_SIZE 256
/ *上記の説明に従って文字列連結を実装する再帰関数* /
空所stringconcatenate((char *S1、char *S2)。
{{
静的 int私=0;
静的 intNS;
NS= strlen ((S1)。;
もしも((!S2[私])。
{{
S2[私]=' 0';
}
そうしないと
{{
S1[NS] =S2[私];
S1[NS+1] = ' 0';
私++;
stringconcatenate((S1、S2)。;
}
}
int主要(()。
{{
charS1[BUF_SIZE]、S2[BUF_SIZE];
printf (('最初の文字列の値を入力してください:')。; / * 1番目の文字列を入力するためのユーザーメッセージ* /
fgets ((S1、BUF_SIZE、stdin)。; / *ユーザーが最初の文字列を入力し、S1に格納します* /
S1[ strlen ((S1)。-1] = ' 0';
printf (('2番目の文字列の値を入力してください:')。; / * 2番目の文字列を入力するためのユーザーメッセージ* /
fgets ((S2、BUF_SIZE、stdin)。; / *ユーザーが最初の文字列を入力し、S2に保存します* /
S2[ strlen ((S2)。-1] = ' 0';
stringconcatenate((S1、S2)。; / * S1、S2をパラメーターとして関数を呼び出します* /
printf (('文字列の組み合わせ='%s 'NS'、S1)。;
戻る 0;
}
プログラムと出力のスナップショット:
関数を使用した連結
関数strconcatenate()は、main()によって呼び出され、2つの文字列を結合します。
この関数は、stringlen(string1)を使用してstring1の長さを取得します。
string1 [i + j]のstring2 [i]の要素に隣接します。この手順は、文字列が空になるまで繰り返されます。ここでは、string1の最後でstring2をstring1に隣接させます。
連結された文字列(文字列1)は、forループのすべての反復が実行される終了までに受信されます。
main()は、連結された文字列S1を出力します
#含む#含む
#define BUF_SIZE 256
/ *上記の説明に従って文字列連結を実装する関数* /
空所strconcatenate((char *string1、 char*string2)。
{{
int私;
intNS= strlen ((string1)。;
にとって((私=0;ストリング2[私];私++)。
{{
string1[私+NS]=string2[私];
}
string1[私+NS]= ' 0';
}
int主要(()。
{{
charstring1[BUF_SIZE]、string2[BUF_SIZE];
printf (('最初の文字列を入力してください:')。; / * 1番目の文字列のユーザーメッセージ* /
fgets ((string1、BUF_SIZE、stdin)。; / *ユーザー入力の2番目の文字列。string1に格納されます* /
string1[ strlen ((string1)。-1] = ' 0';
printf (('2番目の文字列を入力してください:')。; / * 2番目の文字列のユーザーメッセージ* /
fgets ((string2、BUF_SIZE、stdin)。; / * string2に格納されたユーザー入力の2番目の文字列* /
string2[ strlen ((string2)。-1] = ' 0';
strconcatenate((string1、string2)。; / * string1とstring2を引数として関数を呼び出します* /
printf (('結果の文字列=%s'NS'、string1)。;
戻る 0;
}
プログラムと出力のスナップショット:
memcpyを使用した文字列の連結
memcpy()関数を使用すると、文字列の連結は、32ビットマシンで実行していることを考慮して、ある文字列バッファから別の文字列バッファの末尾に単語ごとにコピーすることによって行われます。 strcat()関数を使用した文字列連結を使用すると、連結は、ある文字列バッファから別の文字列バッファにバイトごとにコピーすることによって行われます。
このアプローチはパフォーマンス効率が高いです。
memcpyを使用する際の唯一の考慮事項は、「 0」の処理です。
memcpyでstrcatを実現するCプログラム:
#含む#含む
#define BUF_SIZE 256
ボイドstrcat_memcpy((char *S1、 char *S2)。
{{
int長さ1、長さ2;
長さ1= strlen ((S1)。;
長さ2= strlen ((S2)。;
memcpy ((S1+長さ1、S2、長さ2)。;
}
int主要(()。
{{
charstring1[BUF_SIZE]、string2[BUF_SIZE];
printf (('最初の文字列を入力してください:')。; / * 1番目の文字列のユーザーメッセージ* /
fgets ((string1、BUF_SIZE、stdin)。; / *ユーザー入力の2番目の文字列。string1に格納されます* /
string1[ strlen ((string1)。-1] = ' 0';
printf (('2番目の文字列を入力してください:')。; / * 2番目の文字列のユーザーメッセージ* /
fgets ((string2、BUF_SIZE、stdin)。; / * string2に格納されたユーザー入力の2番目の文字列* /
string2[ strlen ((string2)。-1] = ' 0';
strcat_memcpy((string1、string2)。; / * string1とstring2を引数として関数を呼び出します* /
printf (('結果の文字列=%s'NS'、string1)。;
戻る 0;
}
プログラムと出力のスナップショット:
結論:
このすべての議論で、Cでの文字列連結を結論付けることができます。文字列連結の多くの例とサンプルプログラムを見てきました。主な項目を思い出します。2つの方法があります。1つはC標準を使用する方法で、もう1つはユーザー定義の方法です。ユーザー定義は、ユーザーが文字列連結を実装する方法に応じて、さらに多くのタイプにすることができます。