Подсчитайте количество вхождений каждой буквы в строке
Как я могу подсчитать количество вхождений в c каждой буквы (игнорируя регистр) в строке? Чтобы он мог вывести letter: # number of occurences, у меня есть код для подсчета встречаемости одной буквы, но как я могу подсчитать появление каждой буквы в строке?
{
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...
13 ответов:
Предположим, что у вас есть система, в которой
charявляется восьмибитной и все символы, которые вы пытаетесь подсчитать, кодируются с использованием неотрицательного числа. В этом случае вы можете написать: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]); }Обратите внимание, что это будет считать все символы в строке. Если вы на 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]); }
Вот так:
int counts[26]; memset(counts, 0, sizeof(counts)); char *p = string; while (*p) { counts[tolower(*p++) - 'a']++; }Этот код предполагает, что строка имеет нулевой конец и содержит только символы
Чтобы понять, как это работает, вспомните, что после преобразованияaчерезzилиAчерезZвключительно.tolowerкаждая буква имеет код междуaиz, и что коды являются последовательными. В результатеtolower(*p) - 'a'вычисляется до числа от0до25включительно, представляющего порядковый номер буквы в алфавит.Этот код объединяет
++и*pдля сокращения программы.
#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; }
Одна простая возможность состояла бы в том, чтобы сделать массив из 26 int, каждый из которых является числом для буквы a-z:
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Это простая идея, которая работает для A-Z, a-z. Если вы хотите разделить по заглавным буквам, вам просто нужно сделать счет 52 вместо этого и вычесть правильное смещение ASCII
Вы можете использовать следующий код.
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]); } }Надеюсь, это поможет.
#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; }
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 будет хранить появление любого символа в строке.
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
После Принятия Ответа
Хотя метода, который соответствует этим спецификациям. (ИМО, другие ответы не отвечают всем)
Является практичным / эффективным, когда
charимеет широкий диапазон. Иво:CHAR_BIT- это16или32, так что нетbool Used[1 << CHAR_BIT];Работает для очень длинных строк (используйте
size_tвместоint).Не полагается на ASCII. (
Use Upper[])Определенное поведение, когда A
charisalpha() определено дляEOFиunsigned charstatic const char Upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const char Lower[] = "abcdefghijklmnopqrstuvwxyz"; void LetterOccurances(size_t *Count, const char *s) { memset(Count, 0, 26*sizeof Count); 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]; LetterOccurances(Count, s); for (int i=0; i<26; i++) printf("%c : %zu\n", Upper[i], Count[i]); }
Вот код C с пользовательской функцией:
/* C Program to count the frequency of Character in a given String */ #include <stdio.h> void find_frequency(char string[], int count[]); int main() { char string[100]; int i, count[26] = {0}; printf("Input a string\n"); gets(string); find_frequency(string, count); printf("Character Count\n"); for(i = 0 ; i < 26 ; i++) { printf("%c \t %d\n", i + 'a', count[i]); } return 0; } void find_frequency(char string[], int count[]) { int i; for(i = 0; string[i] != '\0'; i++) { if (string[i] >= 'a' && string[i] <= 'z' ) { count[string[i]-'a']++; } } }
/ / это код 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/
/ / 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(); }
protected void btnSave_Click(object sender, EventArgs e) { var FullName = "stackoverflow" char[] charArray = FullName.ToLower().ToCharArray(); Dictionary<char, int> counter = new Dictionary<char, int>(); int tempVar = 0; foreach (var item in charArray) { if (counter.TryGetValue(item, out tempVar)) { counter[item] += 1; } else { counter.Add(item, 1); } } //var numberofchars = ""; foreach (KeyValuePair<char, int> item in counter) { if (counter.Count > 0) { //Label1.Text=split(item. } Response.Write(item.Value + " " + item.Key + "<br />"); // Label1.Text=item.Value + " " + item.Key + "<br />"; spnDisplay.InnerText= item.Value + " " + item.Key + "<br />"; } }
Comments