C 我的角色频率程序似乎有一个无限循环

C 我的角色频率程序似乎有一个无限循环,c,loops,infinite-loop,C,Loops,Infinite Loop,这是我对经典的练习1-14“C编程语言”的解决方案。它应该返回输入中字符的频率。它会这样做,但它会一直打印完整的频率列表,直到编译器停止。我试图找到无限循环的源头。它在哪里 #include <stdio.h> char j; int i; int tally; char input[100]; int k; int main () { for (k = 0; k < 100; k++) { input[k] = getchar(); } for (j = 0;

这是我对经典的练习1-14“C编程语言”的解决方案。它应该返回输入中字符的频率。它会这样做,但它会一直打印完整的频率列表,直到编译器停止。我试图找到无限循环的源头。它在哪里

#include <stdio.h>

char j;
int i;
int tally;
char input[100];
int k;

int main ()
{
for (k = 0; k < 100; k++)
{
    input[k] = getchar();
}

for (j = 0; j <= 127; j++)
{
    tally = 0;
    for (i = 0; i < 100; i++)
    {
        if (input[i] == j)
        { 
            tally++;
        }
    }
    if (tally != 0)
    {
        printf ("%c : %d times\n", j, tally);
    }
}
return 0;
}
#包括
查尔j;
int i;
整数计数;
字符输入[100];
int k;
int main()
{
对于(k=0;k<100;k++)
{
输入[k]=getchar();
}

对于(j=0;j而言,问题在于变量
j
,其类型为
char

for (j = 0 ; j <= 127 ; j++)

并通过避免符号溢出来避免UB?为什么不对循环变量使用
int
。@TimRandall这两种方法都没有区别。@dasblinkenlight谢谢。我明白了。
unsigned char input[100];
int tally[128] = {0};
for (int i = 0 ; i < 100 ; i++) {
    if (input[i] < 128) {
        tally[input[i]]++;
    }
}
for (int c = 0 ; c != 128 ; c++) {
    if (tally[c] != 0) {
        printf("%c : %d times\n", c, tally[c]);
    }
}