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

C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説


C言語の文字列ライブラリ関数とは

C言語には、文字列を扱うための定義済み関数が標準ライブラリ「string.h」に多数用意されています。これらの関数を活用することで、文字列の長さ取得・コピー・連結・比較・検索といった処理を簡単かつ効率的に実装できます。

本記事で紹介する主な文字列関数は以下の通りです。

  • strlen()
  • strcmp()
  • strcpy()
  • strncmp()
  • strncpy()
  • strrev()
  • strcat()
  • strstr()
  • strncat()

C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説

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);

C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説

使用例

#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 の方が小さい(辞書順で前)

C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説

C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説

使用例

#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()

各関数の引数の順序やバッファサイズの要件を正しく理解し、安全に活用してください。


  1. 【初心者向け】JavaScriptのfinallyステートメントをサンプルコード付きでわかりやすく解説

    finallyステートメントは、エラーが発生したかどうかにかかわらず、tryブロックとcatchブロックの処理が完了した後に必ず実行されるブロックです。ファイルのクローズやデータベース接続の切断など、処理の成功・失敗に関係なく必ず実行したい後処理(クリーンアップ処理)を記述する際に非常に便利です。finallyの基本構文try { // エラーが発生する可能性のある処理 } catch (err) { // エラー発生時に実行される処理 } finally { // エラーの有無にかかわらず必ず実行される処理 }サンプルコード以下は、JavaScriptにおけるfinallyステー

  2. 【初心者向け】JavaScriptの非同期関数(async/await)をサンプルコード付きで解説

    非同期関数(async function)とはJavaScriptの非同期関数は、asyncキーワードを付けて定義する特別な関数です。ES2017(ES8)で標準仕様に組み込まれ、従来のコールバック関数よりも簡潔で読みやすい形でPromiseを扱えるようにするために導入されました。async関数の内部ではawaitキーワードを使用できます。awaitを付けた箇所では処理の流れが一時停止し、対象のPromiseが完了(resolveまたはreject)するまで待機します。この仕組みにより、非同期処理をあたかも同期処理のような直感的なコードとして書ける点が最大のメリットです。押さえておきたいポイン