C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説
C言語の文字列ライブラリ関数とは
C言語には、文字列を扱うための定義済み関数が標準ライブラリ「string.h」に多数用意されています。これらの関数を活用することで、文字列の長さ取得・コピー・連結・比較・検索といった処理を簡単かつ効率的に実装できます。
本記事で紹介する主な文字列関数は以下の通りです。
- strlen()
- strcmp()
- strcpy()
- strncmp()
- strncpy()
- strrev()
- strcat()
- strstr()
- strncat()

strlen()関数 ― 文字列の長さを取得する
strlen() は、文字列に含まれる文字数(長さ)を返す関数です。終端のNULL文字('\0')はカウント対象外となります。
構文
int strlen(文字列名);
使用例
#include <string.h>
main (){
char a[30] = "Hello";
int l;
l = strlen(a);
printf("length of the string = %d", l);
getch();
}
実行結果
length of the string = 5
strcpy()関数 ― 文字列をコピーする
- コピー元(ソース)の文字列を、コピー先(デスティネーション)の文字列へ複製します。
- コピー先の配列サイズは、コピー元の文字列以上である必要があります。
構文
strcpy(コピー先の文字列, コピー元の文字列);
引数の順序に注意しましょう。第1引数がコピー先、第2引数がコピー元です。
/* 誤った例 */
char a[50];
strcpy("Hello", a); /* エラーになる */
/* 正しい例 */
char a[50];
strcpy(a, "hello"); /* a = "hello" となる */
使用例
#include <string.h>
main (){
char a[50], b[50];
printf("enter a source string");
scanf("%s", a);
printf("enter destination string");
scanf("%s", b);
strcpy(b, a);
printf("copied string = %s", b);
getch();
}
実行結果
Enter a source string : Hello Copied string = Hello
strncpy()関数 ― 指定したn文字だけコピーする
- コピー元の文字列から先頭の「n」文字だけを、コピー先の文字列へ複製します。
- コピー先の配列サイズは、コピー元の文字列以上である必要があります。
構文
strncpy(コピー先の文字列, コピー元の文字列, n);

使用例
#include <string.h>
main (){
char a[50], b[50];
printf("enter a string");
gets(a);
gets(b);
strncpy(b, a, 3); /* aの先頭3文字をbへコピー */
b[3] = '\0'; /* 終端文字を明示的に設定 */
printf("copied string = %s", b);
getch();
}
実行結果
Enter a string : Hello Copied string = Hel
このように、strncpy()は部分文字列の抽出にも利用できます。
strcat()関数 ― 文字列を連結する
- 2つの文字列を1つに結合します。
- 連結後の結果を格納できるよう、コピー先の配列サイズは十分に大きく取る必要があります。
構文
strcat(コピー先の文字列, コピー元の文字列);
使用例
#include <string.h>
main(){
char a[50] = "Hello";
char b[20] = "Good Morning";
clrscr();
strcat(a, b);
printf("concatenated string = %s", a);
getch();
}
実行結果
Concatenated string = Hello Good Morning
strncat()関数 ― 指定したn文字だけ連結する
- ある文字列の先頭「n」文字を、別の文字列の末尾に連結します。
- コピー先の配列サイズは、コピー元より大きくする必要があります。
- 連結結果はコピー先の文字列に格納されます。
構文
strncat(コピー先の文字列, コピー元の文字列, n);
使用例
#include <string.h>
main (){
char a[30] = "Hello";
char b[20] = "Good Morning";
clrscr();
strncat(a, b, 4); /* bの先頭4文字をaに連結 */
a[9] = '\0';
printf("concatenated string = %s", a);
getch();
}
実行結果
Concatenated string = Hello Good.
strcmp()関数 ― 文字列を比較する
- 2つの文字列を辞書順(ASCIIコード順)に比較します。
- 戻り値は、両文字列で最初に一致しなかった文字同士のASCIIコードの差分です。
構文
int strcmp(文字列1, 文字列2); // 差分が 0 の場合 → 文字列1 と 文字列2 は等しい // 差分が 正 の場合 → 文字列1 の方が大きい(辞書順で後) // 差分が 負 の場合 → 文字列1 の方が小さい(辞書順で前)


使用例
#include <stdio.h>
#include <string.h>
int main (){
char a[50], b[50];
int d;
printf("Enter 2 strings:");
scanf("%s %s", a, b);
d = strcmp(a, b);
if (d == 0){
printf("%s is (alphabetically) equal to %s", a, b);
} else if (d > 0){
printf("%s is (alphabetically) greater than %s", a, b);
} else if (d < 0){
printf("%s is (alphabetically) less than %s", a, b);
}
}
実行結果
Enter 2 strings:apple ball apple is (alphabetically) less than ball
strncmp()関数 ― 先頭n文字だけ比較する
strncmp() は、2つの文字列の先頭「n」文字のみを比較する関数です。
構文
strncmp(文字列1, 文字列2, n);
使用例
char a[10] = "the"; char b[10] = "there"; strncmp(a, b, 4); /* 出力: 両文字列は等しい(the + 終端文字まで一致するため) */
strrev()関数 ― 文字列を反転する
- 文字列の並びを逆順に反転させます。
- 反転結果は元の文字列自身に上書き保存されます。
※ strrev()は標準Cの関数ではなく、Turbo Cなど一部のコンパイラ固有の関数である点に注意してください。
構文
strrev(文字列);
使用例
#include <stdio.h>
main (){
char a[50];
clrscr();
printf("enter a string");
gets(a);
strrev(a);
printf("reversed string = %s", a);
getch();
}
実行結果
enter a string Hello reversed string = olleH
strstr()関数 ― 部分文字列を検索する
- 部分文字列が主文字列の中に存在するかどうかを検索します。
- 見つかった場合、主文字列(s1)内で部分文字列(s2)が最初に出現する位置へのポインタを返します。見つからない場合はNULLを返します。
構文
strstr(主文字列, 部分文字列);
使用例
#include <stdio.h>
void main(){
char a[30], b[30];
char *found;
printf("Enter a string:\t");
gets(a);
printf("Enter the string to be searched for:\t");
gets(b);
found = strstr(a, b);
if(found)
printf("%s is found in %s in %d position", b, a, found - a);
else
printf("-1 since the string is not found");
getch();
}
実行結果
Enter a string: how are you Enter the string to be searched for: you you is found in 8 position
まとめ
C言語の文字列操作は、string.hヘッダーに含まれるライブラリ関数を使えば簡単に実現できます。用途ごとに以下のように使い分けましょう。
- 長さの取得:strlen()
- コピー:strcpy() / strncpy()(n文字のみ)
- 連結:strcat() / strncat()(n文字のみ)
- 比較:strcmp() / strncmp()(先頭n文字のみ)
- 反転:strrev()(一部コンパイラ限定)
- 検索:strstr()
各関数の引数の順序やバッファサイズの要件を正しく理解し、安全に活用してください。
-
【初心者向け】JavaScriptのfinallyステートメントをサンプルコード付きでわかりやすく解説
finallyステートメントは、エラーが発生したかどうかにかかわらず、tryブロックとcatchブロックの処理が完了した後に必ず実行されるブロックです。ファイルのクローズやデータベース接続の切断など、処理の成功・失敗に関係なく必ず実行したい後処理(クリーンアップ処理)を記述する際に非常に便利です。finallyの基本構文try { // エラーが発生する可能性のある処理 } catch (err) { // エラー発生時に実行される処理 } finally { // エラーの有無にかかわらず必ず実行される処理 }サンプルコード以下は、JavaScriptにおけるfinallyステー
-
【初心者向け】JavaScriptの非同期関数(async/await)をサンプルコード付きで解説
非同期関数(async function)とはJavaScriptの非同期関数は、asyncキーワードを付けて定義する特別な関数です。ES2017(ES8)で標準仕様に組み込まれ、従来のコールバック関数よりも簡潔で読みやすい形でPromiseを扱えるようにするために導入されました。async関数の内部ではawaitキーワードを使用できます。awaitを付けた箇所では処理の流れが一時停止し、対象のPromiseが完了(resolveまたはreject)するまで待機します。この仕組みにより、非同期処理をあたかも同期処理のような直感的なコードとして書ける点が最大のメリットです。押さえておきたいポイン