4

文字列内の各文字 (大文字と小文字を区別しない) の c の出現回数をカウントするにはどうすればよいですか? が出力されるようletter: # number of occurencesに、1 文字の出現回数をカウントするコードを用意しましたが、文字列内の各文字の出現回数をカウントするにはどうすればよいでしょうか?

{
    char
    int count = 0;
    int i;

    //int length = strlen(string);

    for (i = 0; i < 20; i++)
    {
        if (string[i] == ch)
        {
            count++;
        }
    }

    return count;
}

出力:

a : 1
b : 0
c : 2
etc...
4

15 に答える 15

8

char8 ビットのシステムがあり、数えようとしているすべての文字が負でない数を使用してエンコードされていると仮定しましょう。この場合、次のように記述できます。

const char *str = "The quick brown fox jumped over the lazy dog.";

int counts[256] = { 0 };

int i;
size_t len = strlen(str);

for (i = 0; i < len; i++) {
    counts[(int)(str[i])]++;
}

for (i = 0; i < 256; i++) {
    if ( count[i] != 0) {
        printf("The %c. character has %d occurrences.\n", i, counts[i]);
    }
}

これにより、文字列内のすべての文字がカウントされることに注意してください。文字列に文字のみ (数字、空白、句読点なし) が含まれることが 100% 確実である場合は、1. 「大文字と小文字を区別しない」ように要求することが理にかなっています。2. エントリの数を減らすことができます。を英語のアルファベットの文字数 (つまり 26) にすると、次のように書くことができます。

#include <ctype.h>
#include <string.h>
#include <stdlib.h>

const char *str = "TheQuickBrownFoxJumpedOverTheLazyDog";

int counts[26] = { 0 };

int i;
size_t len = strlen(str);

for (i = 0; i < len; i++) {
    // Just in order that we don't shout ourselves in the foot
    char c = str[i];
    if (!isalpha(c)) continue;

    counts[(int)(tolower(c) - 'a')]++;
}

for (i = 0; i < 26; i++) {
    printf("'%c' has %2d occurrences.\n", i + 'a', counts[i]);
}
于 2012-11-03T21:01:53.963 に答える
1
#include <stdio.h>
#include <string.h>
void main()
{
    printf("PLEASE ENTER A STRING\n");
    printf("GIVE ONLY ONE SPACE BETWEEN WORDS\n");
    printf("PRESS ENETR WHEN FINISHED\n");

    char str[100];
    int arr[26]={0};
    char ch;
    int i;

    gets(str);
    int n=strlen(str);

    for(i=0;i<n;i++)
    {
        ch=tolower(str[i]);
        if(ch>=97 && ch<=122)   
        {
            arr[ch-97]++;
        }
    }
    for(i=97;i<=122;i++)
        printf("%c OCCURS %d NUMBER OF TIMES\n",i,arr[i-97]);   
    return 0;
}
于 2016-12-21T07:49:36.967 に答える
1

回答を受け入れた後

これらの仕様を満たす方法:(IMO、他の回答はすべてを満たしているわけではありません)

  1. char範囲が広いと実用的/効率的です。例:CHAR_BIT16または32であるため、使用しないbool Used[1 << CHAR_BIT];

  2. 非常に長い文字列に対して機能します ( ではなく使用しますsize_t) int

  3. ASCII に依存しません。( Use Upper[])

  4. a char< 0 の場合の定義済みの動作。およびis...()に対して関数が定義されています。EOFunsigned char

    static const char Upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static const char Lower[] = "abcdefghijklmnopqrstuvwxyz";
    
    void LetterOccurrences(size_t *Count, const char *s) {
      memset(Count, 0, sizeof *Count * 26);
      while (*s) {
        unsigned char ch = *s;
        if (isalpha(ch)) {
          const char *caseset = Upper;
          char *p = strchr(caseset, ch);
          if (p == NULL) {
            caseset = Lower;
            p = strchr(caseset, ch);
          }
          if (p != NULL) {
            Count[p - caseset]++;
          }
        }
      }
    }
    
    // sample usage
    char *s = foo();
    size_t Count[26];
    LetterOccurrences(Count, s);
    for (int i=0; i<26; i++)
      printf("%c : %zu\n", Upper[i], Count[i]);
    }
    
于 2014-08-23T19:14:30.710 に答える
1

このような:

int counts[26];
memset(counts, 0, sizeof(counts));
char *p = string;
while (*p) {
    counts[tolower(*p++) - 'a']++;
}

このコードは、文字列が NULL で終了し、aからまでの文字のみが含まれていることを前提としています。zAZ

これがどのように機能するかを理解するには、変換後にtolower各文字に と の間のコードがaありz、コードが連続していることを思い出してください。結果として、 は から までの数値に評価tolower(*p) - 'a'され、アルファベットでの文字の連番を表します。025

++このコードはとを組み合わせ*pてプログラムを短縮します。

于 2012-11-03T21:00:16.630 に答える
1

単純な可能性の 1 つは、26 個の int の配列を作成することです。それぞれが文字 az のカウントです。

int alphacount[26] = {0}; //[0] = 'a', [1] = 'b', etc

次に、文字列をループして、文字ごとにカウントを増やします。

for(int i = 0; i<strlen(mystring); i++)      //for the whole length of the string
    if(isalpha(mystring[i]))
        alphacount[tolower(mystring[i])-'a']++;  //make the letter lower case (if it's not)
                                                 //then use it as an offset into the array
                                                 //and increment

AZ、azで機能するシンプルなアイデアです。大文字で区切りたい場合は、代わりにカウントを 52 にして、正しい ASCII オフセットを減算するだけです。

于 2012-11-03T21:08:34.473 に答える
0

ユーザー定義関数を使用した C コードは次のとおりです。

/* C Program to count the frequency of characters in a given String */

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

const char letters[] = "abcdefghijklmnopqrstuvwxzy";

void find_frequency(const char *string, int *count);

int main() {
    char string[100];
    int count[26] = { 0 };
    int i;

    printf("Input a string: ");
    if (!fgets(string, sizeof string, stdin))
        return 1;

    find_frequency(string, count);

    printf("Character Counts\n");

    for (i = 0; i < 26; i++) {
        printf("%c\t%d\n", letters[i], count[i]);
    }
    return 0;
}

void find_frequency(const char *string, int *count) {
    int i;
    for (i = 0; string[i] != '\0'; i++) {
        p = strchr(letters, string[i]);
        if (p != NULL) {
            count[p - letters]++;
        }
    }
}
于 2015-06-23T05:34:51.407 に答える
0

次のコードを使用できます。

main()
{
    int i = 0,j=0,count[26]={0};
    char ch = 97;
    char string[100]="Hello how are you buddy ?";
    for (i = 0; i < 100; i++)
    {
        for(j=0;j<26;j++)
            {
            if (tolower(string[i]) == (ch+j))
                {
                    count[j]++;
                }
        }
    }
    for(j=0;j<26;j++)
        {

            printf("\n%c -> %d",97+j,count[j]);

    }

}

お役に立てれば。

于 2012-11-03T21:07:42.770 に答える
0
#include<stdio.h>
#include<string.h>

#define filename "somefile.txt"

int main()
{
    FILE *fp;
    int count[26] = {0}, i, c;  
    char ch;
    char alpha[27] = "abcdefghijklmnopqrstuwxyz";
    fp = fopen(filename,"r");
    if(fp == NULL)
        printf("file not found\n");
    while( (ch = fgetc(fp)) != EOF) {
        c = 0;
        while(alpha[c] != '\0') {

            if(alpha[c] == ch) {
                count[c]++; 
            }
            c++;
        }
    }
    for(i = 0; i<26;i++) {
        printf("character %c occured %d number of times\n",alpha[i], count[i]);
    }
    return 0;
}
于 2013-10-24T12:10:47.060 に答える
-1

//c 文字列内の各文字の出現回数をカウントするコード。

void main()
   {
   int i,j; int c[26],count=0; char a[]="shahid";
   clrscr();
   for(i=0;i<26;i++)
    {
        count=0;
          for(j=0;j<strlen(a);j++)
                {
                 if(a[j]==97+i)
                    {
                     count++;
                         }
                           }
                  c[i]=count;
               }
              for(i=0;i<26;i++)
               {
              j=97+i;
          if(c[i]!=0) {  printf("%c of %d times\n",j,c[i]);
                 }
              }
           getch();
           }
于 2016-02-12T17:44:21.540 に答える
-1

//これは JavaScript コードです。

function countWordOccurences()
{
    // You can use array of words or a sentence split with space.
    var sentence = "The quick brown fox jumped over the lazy dog.";
    //var sentenceArray = ['asdf', 'asdf', 'sfd', 'qwr', 'qwr'];
    var sentenceArray = sentence.split(' ', 1000); 
    var output;
    var temp;
    for(var i = 0; i < sentenceArray.length; i++) {
        var k = 1;
        for(var j = i + 1; j < sentenceArray.length; j++) {
            if(sentenceArray[i] == sentenceArray[j])
                    k = k + 1;
        }
        if(k > 1) {
            i = i + 1;
            output = output + ',' + k + ',' + k;
        }
        else
            output = output + ',' + k;
    }
    alert(sentenceArray + '\n' + output.slice(10).split(',', 500));
}

You can see it live --> http://jsfiddle.net/rammipr/ahq8nxpf/
于 2015-10-01T11:10:49.000 に答える
-1
int charset[256] = {0};
int charcount[256] = {0};

for (i = 0; i < 20; i++)
{
    for(int c = 0; c < 256; c++)
    {
        if(string[i] == charset[c])
        {
           charcount[c]++;
        }
    }
}

charcount は、文字列内の任意の文字の出現を格納します。

于 2012-11-03T21:00:29.333 に答える