C言語で文字列の出現回数を調べる方法は?

ループや条件分岐を用いてC言語でストリング内での部分文字列の出現回数を検索できます。例として次のコードがあります。

#include <stdio.h>
#include <string.h>

int countOccurrences(const char *str, const char *subStr) {
    int count = 0;
    int subStrLen = strlen(subStr);
    
    while (*str) {
        if (strncmp(str, subStr, subStrLen) == 0) {
            count++;
        }
        str++;
    }
    
    return count;
}

int main() {
    char str[100];
    char subStr[100];
    
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';  // 删除换行符
    
    printf("请输入要查找的子串:");
    fgets(subStr, sizeof(subStr), stdin);
    subStr[strcspn(subStr, "\n")] = '\0';  // 删除换行符
    
    int occurrences = countOccurrences(str, subStr);
    
    printf("子串 \"%s\" 在字符串 \"%s\" 中出现了 %d 次。\n", subStr, str, occurrences);
    
    return 0;
}

上記のコードでは、countOccurrences 関数は文字列内の部分文字列の出現回数を数えるために使われます。strcmp 関数が文字列の比較に使用されており、while ループは文字列全体を走査し、毎回、部分文字列と等しいかどうか文字列の一部を比較し、等しければカウントを 1 増やしてからループを続けます。最終的にはカウントの値が返されます。

メイン関数では、まずユーザーから文字列と部分文字列の入力を受け取ります。そして countOccurrences 関数を実行して、部分文字列が文字列中に何回現れるかを確認し、結果を出力します。

ご注意ください:

  1. fgets関数で入力された文字列や部分文字列を読み込み、strcspn関数で改行を削除します。
  2. このコードでは文字列中の連続したサブストリング出現回数しかカウントできないので、連続していない場合カウントするには修正が必要です。
bannerAds