我的字符频率程序似乎有一个无限循环
My character frequency program seems to have an infinite loop
这是我经典练习题1-14的解法,"The C Programming Language."应该是return输入字符的频率。它会这样做,但它会一直打印完整的频率列表,直到编译器停止。我试图找到无限循环的来源。它在哪里?
#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
上,它的类型为 char
:
for (j = 0 ; j <= 127 ; j++)
在 char
已签名的系统上,char
的最大值为 127
,这意味着 j <= 127
条件始终为真。
虽然您可以通过将 j
声明为 unsigned char
来解决此问题,但还有一种更好的字符计数方法:创建一个包含 128 个计数器的数组,然后遍历 input[]
一次:
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]);
}
}
这是我经典练习题1-14的解法,"The C Programming Language."应该是return输入字符的频率。它会这样做,但它会一直打印完整的频率列表,直到编译器停止。我试图找到无限循环的来源。它在哪里?
#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
上,它的类型为 char
:
for (j = 0 ; j <= 127 ; j++)
在 char
已签名的系统上,char
的最大值为 127
,这意味着 j <= 127
条件始终为真。
虽然您可以通过将 j
声明为 unsigned char
来解决此问题,但还有一种更好的字符计数方法:创建一个包含 128 个计数器的数组,然后遍历 input[]
一次:
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]);
}
}