Взяв именно ваш код, отформатировав его для удобочитаемости и добавив проверку, чтобы убедиться, что используются только цифры, чтобы избежать дальнейших ошибок, это сработало.Проверка не была необходима для функциональности, но это хорошая идея, чтобы избежать записи за пределы массива.
#include <stdio.h>
#include <ctype.h>
int main() {
int a[10]; //array
int c; //store input from getchar
int i; //loop variable
for(i=0;i<10;i++)
{
a[i]=0; //initialize to 0
}
while((c=getchar())!=EOF) //read character
{
if (isdigit(c))
++a[c - '0'];
}
for(i=10;i>0;i--) //asssumed max limit of frequency is 10
{
int j; //iterate through the array
for(j=0;j<10;j++)
{
if(a[j]==i) //if frequency of any element in array matches i
{
printf("* \t");
--a[j]; //decrement array element frequency value
}
else
printf(" \t"); //no action
}
printf("\n"); //next line
}
}
Результат:
$ ./a
0123456789666338592
*
* *
* * * * * *
* * * * * * * * * *
Для справки, это было скомпилированодля Cygwin.Я также изменил ваш исходный код несколькими способами, чтобы соответствовать некоторым из практик, которым я следую:
#include <stdio.h>
#include <ctype.h>
int main()
{
int a[10] = {0}; // While use a for to initialize to 0 when you can do it easily?
int i;
char c;
while((c = getchar()) != EOF)
{
if (isdigit(c)) // Never trust the user
a[c - '0']++; // Changed for readability, make it clear that we are incrementing the value, not the pointer.
}
for(i = 10; i > 0; --i)
{
int j;
for(j = 0; j < 10; ++j)
{
// Made flow a little clearer
if(a[j] >= i)
putchar('*');
else
putchar(' ');
putchar('\t');
}
putchar('\n');
}
}
То, что вы делаете, конечно, зависит от вас, я лично считаю это более последовательным.