printf や scanf など C 言語に標準で用意されている関数を「標準関数」とか「標準ライブラリ関数」とか「「標準 C ライブラリ関数」と呼びましたが(※)、文字列配列を扱う標準関数をここでは学びます。
※ 具体的には国際標準化機構(ISO)と国際電気標準会議(IEC)が何を標準関数にするか決めています。現時点(2016年11月)での最新規格はISO/IEC9899:2011(通称C11)です。
文字列配列を扱う標準関数は沢山あるのですが原則として str〜 という名前の関数になっています。そこで「文字列配列を扱う標準関数」と書くと長いので今後は str 系標準関数と略すことにします。ちなみに str は string の略です。
さて str 系標準関数の全てを説明すると大変ですので、とりあえず今回は良く使われている以下の3つの str 系標準関数を取り扱いたいと思います。
※ str 系標準関数を使うためには string.h をインクルードして下さい。
strlen 関数 : 文字列の長さを調べる関数
strcat 関数 : 2つの文字列を連結する関数
strcpy 関数 : 文字列をコピーする関数
strlen 関数は length of a string の略で文字列の長さを調べる関数になります。使い方は以下の通りです。
※ この関数は古い関数でセキュリティ的に危険なので使わない方が良いです。 何故危険なのかは自分で調べてみましょう。 C11以降は「strnlen_s」を代わりに使うことが推奨されています。
strlen( 文字列配列の先頭アドレス );
戻り値: 文字列配列に含まれる文字列の長さ(int 型)
※ ヌル終端文字が含まれていないと正しい値が出て来ません。
※ 戻り値(文字列の長さ)にはヌル終端文字の分は含まれません。
(使用例) char a[256] = "hoge"; int n = strlen( a ); printf("%d\n", n ); // 4 と表示される
strcat 関数は concatenate two strings の略で2つの文字列を連結する関数です。使い方は以下の通りです。
※ この関数は古い関数でセキュリティ的に「極めて」危険なので「絶対に」使わないで下さい。 何故危険なのかは自分で調べてみましょう。 どうしても使いたい時はせめて「strncat」、C11以降なら「strcat_s」又は「strncat_s」を代わりに使いましょう。
strcat( 文字列配列 1 の先頭アドレス, 文字列配列 2 の先頭アドレス )
結果: 文字列配列 1 の文字列の最後に文字列配列 2 の文字列が連結コピーされる
戻り値: 文字列配列 1 の先頭アドレス(番地)
※ 両方の文字列配列にヌル終端文字が含まれていないと正しい結果になりません。
(使用例) char a[256] = "hoge"; char b[256] = "fuga"; strcat( a, b ); printf("%s\n", a ); // hogefuga と表示される
strcpy 関数は copy the string の略で文字列をコピーする関数です。使い方は以下の通りです。
※ この関数は古い関数でセキュリティ的に「極めて」危険なので「絶対に」使わないで下さい。 何故危険なのかは自分で調べてみましょう。 どうしても使いたい時はせめて「strncpy」、C11以降なら「strcpy_s」又は「strncpy_s」を代わりに使いましょう。
strcpy( 文字列配列 1 の先頭アドレス, 文字列配列 2 の先頭アドレス )
結果: 文字列配列 1 の文字列の先頭から文字列配列 2 の文字列がコピーされる
戻り値: 文字列配列 1 の先頭アドレス(番地)
※ 文字列配列 2 にヌル終端文字が含まれていないと正しい結果になりません。
(使用例) char a[256]; char b[256] = "fuga"; strcpy( a, b ); printf("%s\n", a ); // fuga と表示される