Вот возможное решение, которое близко к вашему исходному коду:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXBUF 10000
int main()
{
printf("Enter: \n");
char sifra[MAXBUF];
int pole[26]={0};
char pismeno, znak;
int i;
int l, max, temp;
int m, x, y;
char abeceda[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
fgets(sifra, MAXBUF, stdin);
int n=strlen(sifra);
for(i=0; i<n; i++)
{
pismeno= tolower(sifra[i]);
if(pismeno>=97 && pismeno<=122)
{
pole[pismeno-97]++;
}
}
for(i=97; i<=122; i++)
{
printf("%c --- %d -times\n",toupper(i),pole[i-97]);
}
// Sorting it here
l= 25;
do
{
max=0;
for (x=0; x<=l; x++)
{
if (pole[x]>pole[max])
max=x;
else if (pole[x] == pole[max])
if (abeceda[x] < abeceda[max])
max = x;
}
temp=pole[l];
pole[l]=pole[max];
pole[max]=temp;
znak=abeceda[l];
abeceda[l]=abeceda[max];
abeceda[max]=znak;
l--;
}while (l!=0);
for(y=25; y>-1; y--)
{
printf("%c = %d, ",toupper(abeceda[y]), pole[y]);
}
printf(" \n ");
return 0;
}
Исправленные проблемы и комментарии:
- Как упоминалось в комментариях, вы пропустили
ctype.h
библиотека, которая предоставляет функции tolower
и toupper
- хотя я предполагаю, что это была опечатка. - Аналогично, как вы сказали, в инициализации
abeceda
была опечатка - она должна иметь26 символов, а не 25, и закрывающая скобка должна была быть квадратной.Обратите внимание, что вы также можете написать char abeceda[] = {your list}
, и компилятор сам определит размер массива.Ясно, что в этом случае формулирование этого явно представляется мне лучшей идеей, поскольку мы имеем дело с известным набором - алфавитом известного размера.Превращение ее в отдельную переменную и повторное использование этой переменной в циклах также кажется хорошим выбором. - Как писал @JonathanLeffler - используйте
fgets
вместо gets
(и прочитайтесообщения из ссылки , которую он предоставил) - это реализовано вместе с заранее определенным максимальным размером буфера MAXBUF
. - Вместо того, чтобы печатать буквы алфавита по порядку в последнем цикле, выхочу напечатать буквы в
abeceda
как отсортированные. - Наконец, как это было в OP, сортировка эффективно перепутала буквы с одинаковым количеством.Что он делает сейчас, так это то, что сортирует эти записи в алфавитном порядке букв, что, как я понял, было целью.
main()
должен возвращать int
вместо void
(фактически вы возвращаетеint
и это не скомпилируется на моей машине). - Некоторые имена переменных могли бы использовать улучшение, по крайней мере, на мой взгляд, в то время как
znak
("знак") имеет некоторый смысл, pomm
можетбыть просто заменено на temp
.Также осторожно с однобуквенными переменными, такими как x
и и y
(и n
, m
...) - лучше быть более многословным или, по крайней мере, придерживаться i, j, k, которые обычноиспользуется в петлях.n
было бы более читабельным для меня, если бы это было что-то вроде nchar
. - Используйте отступ для улучшения читабельности.Я бы также использовал меньше пробелов между частями кода.
Вывод слова Hello
теперь будет выглядеть так:
L = 2, E = 1, H = 1, O = 1, A = 0, B = 0, C = 0, D = 0, F = 0, G = 0, I = 0, J = 0, K = 0, M = 0, N = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, Z = 0,
Если вы хотите избавиться отпоследнюю запятую вы также можете сделать:
for(y=25; y>0; y--)
{
printf("%c = %d, ",toupper(abeceda[y]), pole[y]);
}
printf("%c = %d ",toupper(abeceda[y]), pole[y]);
printf(" \n ");
Стоит отметить, что обычно вы хотите использовать более модульную конструкцию.В этом случае, по крайней мере, функция для сортировки, а не прямой ввод всего в main
.Когда вы прогрессируете в учебе, я рекомендую начать писать функции, чем раньше, тем лучше.Они улучшают читаемость программ и облегчают отладку.