web-dev-qa-db-fra.com

Compter le nombre d'occurrences de chaque lettre dans la chaîne

Comment puis-je compter le nombre d'occurrences dans c de chaque lettre (cas ignoré) dans la chaîne? Pour qu'il imprime letter: # number of occurences, j'ai le code pour compter les occurrences d'une lettre, mais comment puis-je compter l'occurrence de chaque lettre dans la chaîne?

{
    char
    int count = 0;
    int i;

    //int length = strlen(string);

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

    return count;
}

sortie:

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

Supposons que vous avez un système où char est égal à huit bits et que tous les caractères que vous essayez de compter sont codés à l'aide d'un nombre non négatif. Dans ce cas, vous pouvez écrire:

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++) {
    printf("The %d. character has %d occurrences.\n", i, counts[i]);
}

Notez que cela comptera tous les caractères de la chaîne. Si vous êtes totalement sûr à 100% que votre chaîne ne contiendra que des lettres (pas de chiffres, pas de blancs, pas de ponctuation), alors 1. demander "insensibilité à la casse" commence à avoir un sens, 2. vous pouvez réduire le nombre d'entrées au nombre de caractères de l'alphabet anglais (à savoir 26) et vous pouvez écrire quelque chose comme ceci:

#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]);
}
8
user529758

Comme ça:

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

Ce code suppose que la chaîne est terminée par un caractère null et qu'elle ne contient que les caractères a à z ou A à Z, inclus.

Pour comprendre comment cela fonctionne, rappelez-vous qu'après la conversion tolower, chaque lettre a un code compris entre a et z et que les codes sont consécutifs. Par conséquent, tolower(*p) - 'a' donne un nombre compris entre 0 et 25, inclus, représentant le numéro séquentiel de la lettre dans l'alphabet.

Ce code combine ++ et *p pour raccourcir le programme.

1
dasblinkenlight

Une possibilité simple serait de faire un tableau de 26 ints, chacun étant un compte pour une lettre a-z:

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

Ensuite, parcourez la chaîne et incrémentez le nombre pour chaque lettre:

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

C'est une idée simple qui fonctionne pour A-Z, a-z. Si vous souhaitez séparer par majuscules, il vous suffit de définir le nombre 52 et de soustraire le décalage correct ASCII

1
Mike

Après avoir accepté la réponse

Une méthode qui répond à ces spécifications: (IMO, les autres réponses ne répondent pas à toutes)

  1. C'est pratique/efficace lorsque char a un wide range. Exemple: CHAR_BIT est 16 ou 32, donc aucune utilisation de bool Used[1 << CHAR_BIT];

  2. Fonctionne pour very chaînes longues (utilisez size_t plutôt que int).

  3. Ne repose pas sur ASCII. (Use Upper[])

  4. Comportement défini lorsqu'un char <0. is...() fonctions sont définies pour EOF et unsigned 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]);
    }
    
1
chux
#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;
}
1
mrc_03
#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;
}
0
Megharaj

Vous pouvez utiliser le code suivant. 

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

    }

}

J'espère que cela t'aides.

0
CCoder
#include<stdio.h>

void frequency_counter(char* str)
{
    int count[256] = {0};  //partial initialization
    int i;

    for(i=0;str[i];i++)
        count[str[i]]++;

    for(i=0;str[i];i++) {
        if(count[str[i]]) {
            printf("%c %d \n",str[i],count[str[i]]);
            count[str[i]]=0;
        }
    }
}

void main()
{
    char str[] = "The quick brown fox jumped over the lazy dog.";
    frequency_counter(str);
}
0
kamalnayan242

Voici le code C avec la fonction définie par l'utilisateur:

/* 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]++;
        }
    }
}
0
Pratik Patil
for (int i=0;i<Word.length();i++){
         int counter=0;
         for (int j=0;j<Word.length();j++){
             if(Word.charAt(i)==Word.charAt(j))
             counter++;
             }// inner for
             JOptionPane.showMessageDialog( null,Word.charAt(i)+" found "+ counter +" times");
         }// outer for
0
mero