[C言語] 文字列の文字数をカウントする方法を解説


C言語で文字列の文字数をカウントするには、標準ライブラリの関数strlenを使用します。

この関数は、string.hヘッダーファイルに含まれており、引数として文字列のポインタを受け取ります。

返り値として、終端のヌル文字を除いた文字列の長さを返します。

例えば、char str[] = "Hello";の場合、strlen(str)は5を返します。

この方法は、文字列の長さを効率的に取得するために広く利用されています。

この記事でわかること
  • strlen関数の使い方と内部動作
  • 特定の文字やワイド文字列、マルチバイト文字列の文字数カウント方法
  • 文字列カウントにおけるエッジケースと注意点
  • 実践的な文字数カウントプログラムの例

目次から探す

文字数をカウントする基本的な方法

C言語で文字列の文字数をカウントする方法は、プログラミングの基本的なスキルの一つです。

ここでは、strlen関数を使った方法と、手動で文字数をカウントする方法について解説します。

strlen関数の使い方

strlen関数は、C言語の標準ライブラリで提供されている関数で、文字列の長さを取得するために使用されます。

この関数は、文字列の終端を示すNULL文字\0までの文字数を返します。

#include <stdio.h>
#include <string.h>
int main() {
    // 文字列を定義
    char str[] = "こんにちは、世界!";
    // 文字数をカウント
    size_t length = strlen(str);
    // 結果を表示
    printf("文字列の長さは %zu 文字です。\n", length);
    return 0;
}
文字列の長さは 21 文字です。

この例では、strlen関数を使って「こんにちは、世界!」という文字列の長さを取得しています。

strlen関数は、文字列の終端を示すNULL文字を含まないため、実際の文字数を正確に返します。

strlen関数の内部動作

strlen関数は、文字列の先頭から順に文字を数え、NULL文字に到達するまでの文字数を返します。

以下は、strlen関数の内部動作を模倣した簡単な例です。

#include <stdio.h>
size_t my_strlen(const char *str) {
    size_t length = 0;
    // NULL文字に到達するまでループ
    while (str[length] != '\0') {
        length++;
    }
    return length;
}
int main() {
    // 文字列を定義
    char str[] = "こんにちは、世界!";
    // 自作のstrlen関数を使用
    size_t length = my_strlen(str);
    // 結果を表示
    printf("文字列の長さは %zu 文字です。\n", length);
    return 0;
}
文字列の長さは 21 文字です。

この例では、my_strlenという関数を作成し、strlen関数と同様の動作を実現しています。

whileループを使って、文字列の終端に到達するまで文字を数えています。

手動で文字数をカウントする方法

strlen関数を使わずに手動で文字数をカウントする方法もあります。

これは、文字列を一文字ずつ確認し、NULL文字に到達するまでカウントを増やす方法です。

#include <stdio.h>
int main() {
    // 文字列を定義
    char str[] = "こんにちは、世界!";
    int count = 0;
    // 手動で文字数をカウント
    while (str[count] != '\0') {
        count++;
    }
    // 結果を表示
    printf("文字列の長さは %d 文字です。\n", count);
    return 0;
}
文字列の長さは 21 文字です。

この例では、whileループを使って手動で文字数をカウントしています。

strlen関数を使わない場合でも、同様の結果を得ることができます。

手動でカウントする方法は、strlen関数が使用できない環境や、特定の条件で文字列を処理する必要がある場合に役立ちます。

文字数カウントの応用

文字列の文字数をカウントする基本的な方法を理解したら、次は応用的なカウント方法について学びましょう。

ここでは、特定の文字をカウントする方法、ワイド文字列の文字数をカウントする方法、そしてマルチバイト文字列の文字数をカウントする方法について解説します。

特定の文字をカウントする方法

特定の文字が文字列中に何回出現するかをカウントすることは、文字列処理においてよくあるタスクです。

以下の例では、文字列中の特定の文字をカウントする方法を示します。

#include <stdio.h>
int count_char(const char *str, char target) {
    int count = 0;
    int i = 0;
    // 文字列を走査して特定の文字をカウント
    while (str[i] != '\0') {
        if (str[i] == target) {
            count++;
        }
        i++;
    }
    return count;
}
int main() {
    // 文字列を定義
    char str[] = "こんにちは、世界!こんにちは!";
    // 'こ'の出現回数をカウント
    int count = count_char(str, 'こ');
    // 結果を表示
    printf("文字 'こ' の出現回数は %d 回です。\n", count);
    return 0;
}
文字 'こ' の出現回数は 2 回です。

この例では、count_char関数を使って、文字列中の特定の文字の出現回数をカウントしています。

ワイド文字列の文字数をカウントする

ワイド文字列は、通常の文字列よりも多くのメモリを使用して、より多くの文字セットをサポートします。

ワイド文字列の文字数をカウントするには、wcslen関数を使用します。

#include <stdio.h>
#include <wchar.h>
int main() {
    // ワイド文字列を定義
    wchar_t wstr[] = L"こんにちは、世界!";
    // ワイド文字列の長さをカウント
    size_t length = wcslen(wstr);
    // 結果を表示
    wprintf(L"ワイド文字列の長さは %zu 文字です。\n", length);
    return 0;
}
ワイド文字列の長さは 9 文字です。

この例では、wcslen関数を使ってワイド文字列の長さを取得しています。

ワイド文字列は、通常の文字列と異なり、wchar_t型を使用します。

マルチバイト文字列の文字数をカウントする

マルチバイト文字列は、文字ごとに異なるバイト数を持つことがあるため、文字数をカウントするのが少し複雑です。

mbstowcs関数を使って、マルチバイト文字列をワイド文字列に変換し、文字数をカウントする方法を示します。

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main() {
    // マルチバイト文字列を定義
    char mbs[] = "こんにちは、世界!";
    // ワイド文字列用のバッファを用意
    wchar_t wcs[100];
    // マルチバイト文字列をワイド文字列に変換
    size_t length = mbstowcs(wcs, mbs, sizeof(wcs) / sizeof(wchar_t));
    // 結果を表示
    printf("マルチバイト文字列の長さは %zu 文字です。\n", length);
    return 0;
}
マルチバイト文字列の長さは 9 文字です。

この例では、mbstowcs関数を使ってマルチバイト文字列をワイド文字列に変換し、その長さを取得しています。

マルチバイト文字列の文字数を正確にカウントするためには、このような変換が必要です。

エッジケースと注意点

文字列の文字数をカウントする際には、いくつかのエッジケースや注意点があります。

これらを理解しておくことで、プログラムの信頼性を高めることができます。

ここでは、NULL文字の扱い、空文字列の処理、マルチバイト文字の注意点について解説します。

NULL文字の扱い

NULL文字\0は、C言語における文字列の終端を示す特別な文字です。

文字列の長さをカウントする際には、このNULL文字を含めないように注意する必要があります。

strlen関数や手動でのカウントでは、NULL文字に到達した時点でカウントを終了します。

#include <stdio.h>
#include <string.h>
int main() {
    // 文字列を定義
    char str[] = "Hello\0World";
    // 文字数をカウント
    size_t length = strlen(str);
    // 結果を表示
    printf("文字列の長さは %zu 文字です。\n", length);
    return 0;
}
文字列の長さは 5 文字です。

この例では、"Hello\0World"という文字列を定義していますが、strlen関数はNULL文字までの長さを返すため、結果は5文字となります。

空文字列の処理

空文字列は、文字数が0の文字列です。

空文字列を処理する際には、特に注意が必要です。

strlen関数は、空文字列に対して0を返します。

#include <stdio.h>
#include <string.h>
int main() {
    // 空文字列を定義
    char str[] = "";
    // 文字数をカウント
    size_t length = strlen(str);
    // 結果を表示
    printf("空文字列の長さは %zu 文字です。\n", length);
    return 0;
}
空文字列の長さは 0 文字です。

この例では、空文字列に対してstrlen関数を使用しており、結果は0文字となります。

空文字列を扱う際には、NULLポインタと区別することが重要です。

マルチバイト文字の注意点

マルチバイト文字は、1文字が複数のバイトで構成されることがあるため、文字数のカウントが複雑になります。

strlen関数はバイト数を返すため、マルチバイト文字列の正確な文字数を取得するには、mbstowcs関数などを使用してワイド文字列に変換する必要があります。

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

int main() {
    // ロケールの設定
    setlocale(LC_ALL, "");

    // マルチバイト文字列を定義
    char mbs[] = "こんにちは";

    // ワイド文字列用のバッファを用意
    wchar_t wcs[100];

    // マルチバイト文字列をワイド文字列に変換
    size_t length = mbstowcs(wcs, mbs, sizeof(wcs) / sizeof(wchar_t));

    // 結果を表示
    printf("マルチバイト文字列の長さは %zu 文字です。\n", length);

    return 0;
}
マルチバイト文字列の長さは 5 文字です。

この例では、マルチバイト文字列をワイド文字列に変換し、正確な文字数を取得しています。

マルチバイト文字を扱う際には、文字数とバイト数の違いに注意が必要です。

実践例

ここでは、文字数をカウントする実践的なプログラム例を紹介します。

ユーザー入力の文字数をカウントする方法、ファイル内の文字数をカウントする方法、特定の文字の出現回数をカウントする方法について解説します。

ユーザー入力の文字数をカウントするプログラム

ユーザーから入力された文字列の文字数をカウントするプログラムを作成します。

このプログラムでは、fgets関数を使用してユーザー入力を取得します。

#include <stdio.h>
#include <string.h>
int main() {
    // 入力用のバッファを用意
    char input[100];
    printf("文字列を入力してください: ");
    // ユーザー入力を取得
    fgets(input, sizeof(input), stdin);
    // 改行文字を取り除く
    input[strcspn(input, "\n")] = '\0';
    // 文字数をカウント
    size_t length = strlen(input);
    // 結果を表示
    printf("入力された文字列の長さは %zu 文字です。\n", length);
    return 0;
}
文字列を入力してください: こんにちは
入力された文字列の長さは 5 文字です。

このプログラムでは、ユーザーから入力された文字列の長さをカウントし、結果を表示します。

fgets関数を使用することで、バッファオーバーフローを防ぎつつ安全に入力を取得できます。

ファイル内の文字数をカウントするプログラム

ファイル内の文字数をカウントするプログラムを作成します。

このプログラムでは、ファイルを読み込み、文字数をカウントします。

#include <stdio.h>
int main() {
    // ファイルポインタを宣言
    FILE *file;
    // ファイルを開く
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    int count = 0;
    int ch;
    // ファイルの終わりまで文字を読み込む
    while ((ch = fgetc(file)) != EOF) {
        count++;
    }
    // ファイルを閉じる
    fclose(file);
    // 結果を表示
    printf("ファイル内の文字数は %d 文字です。\n", count);
    return 0;
}
ファイル内の文字数は 123 文字です。

このプログラムでは、fgetc関数を使用してファイルから1文字ずつ読み込み、文字数をカウントしています。

ファイルが存在しない場合にはエラーメッセージを表示します。

特定の文字の出現回数をカウントするプログラム

文字列中の特定の文字の出現回数をカウントするプログラムを作成します。

このプログラムでは、ユーザーが指定した文字の出現回数をカウントします。

#include <stdio.h>
int count_char(const char *str, char target) {
    int count = 0;
    int i = 0;
    // 文字列を走査して特定の文字をカウント
    while (str[i] != '\0') {
        if (str[i] == target) {
            count++;
        }
        i++;
    }
    return count;
}
int main() {
    // 文字列を定義
    char str[] = "プログラミングは楽しい!";
    // ユーザーに文字を入力させる
    char target;
    printf("カウントしたい文字を入力してください: ");
    scanf("%c", &target);
    // 出現回数をカウント
    int count = count_char(str, target);
    // 結果を表示
    printf("文字 '%c' の出現回数は %d 回です。\n", target, count);
    return 0;
}
カウントしたい文字を入力してください: い
文字 'い' の出現回数は 1 回です。

このプログラムでは、ユーザーが指定した文字の出現回数をカウントし、結果を表示します。

count_char関数を使用して、文字列中の特定の文字を効率的にカウントしています。

よくある質問

strlen関数はどのように動作しますか?

strlen関数は、C言語の標準ライブラリに含まれる関数で、文字列の長さを計算します。

この関数は、文字列の先頭から順に文字を数え、終端のNULL文字\0に到達するまでの文字数を返します。

NULL文字自体はカウントに含まれません。

例えば、strlen("Hello")は5を返します。

マルチバイト文字列の文字数を正確にカウントするにはどうすればいいですか?

マルチバイト文字列の文字数を正確にカウントするには、mbstowcs関数を使用してマルチバイト文字列をワイド文字列に変換し、その後wcslen関数でワイド文字列の長さを取得する方法があります。

これにより、マルチバイト文字が正しくカウントされ、文字数を正確に把握できます。

文字列の長さと配列のサイズは同じですか?

文字列の長さと配列のサイズは必ずしも同じではありません。

文字列の長さは、文字列中の実際の文字数を示し、NULL文字は含まれません。

一方、配列のサイズは、配列が占めるメモリの総バイト数を示し、NULL文字を含むことが多いです。

例えば、char str[10] = "Hello";の場合、文字列の長さは5ですが、配列のサイズは10です。

まとめ

文字列の文字数をカウントする方法は、C言語プログラミングにおいて基本的かつ重要なスキルです。

strlen関数の使い方や、マルチバイト文字列の扱い方、エッジケースへの対処法を学ぶことで、より正確で効率的なプログラムを作成できます。

この記事を参考に、実際のプログラムで文字列操作を試してみてください。

  • URLをコピーしました!
目次から探す