-1
该项目计算书中字母的平均字母频率 - 出于某种原因,A,B和Z的数字大幅增加 - 数十亿。我在这里错过了什么吗?我觉得没有错误,但由此产生的代码是错误的。 argv[1]
是书文件,argv[2]
是新文件。字母频率 - 不成比例的高比率
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NUM_LETTERS 26
int main(int argc, char *argv[])
{
FILE *fp,*fp2;
int ch, totalcounter = 0, i;
int letters[25];
double letterfrequency[25];
if(argc < 2)
{
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
exit(1);
}
for(i=0; i<NUM_LETTERS; i++)
{
letters[i] = 0;
letterfrequency[i] = 0.0;
}
printf("Opening: %s", argv[1]);
fp = fopen(argv[1], "r");
if(!fp)
{
perror("fopen");
exit(1);
}
while((ch=fgetc(fp)) != EOF)
{
ch = toupper(ch);
if('A' <= ch && ch <= 'Z')
{
ch -= 65;
letters[ch]++;
totalcounter++;
}
}
fp2 = fopen(argv[2], "w");
for(i=0; i<NUM_LETTERS; i++)
{
letterfrequency[i] = (double)letters[i]/totalcounter;
}
for(i=0; i<NUM_LETTERS; i++)
{
fprintf(fp2, "\n%c: Times used: %10d\tFrequency Used: %20.20lf", i+65, letters[i], letterfrequency[i]);
}
fclose(fp);
fclose(fp2);
return 0;
}
哪个字母仅具有25个信吗?你正在写出你的数组的界限,所以任何事情都会发生。 –
一个快速而脏的测试文件,只包含字母a到z的段落错误。你的代码需要一些工作。 – David
您使用字符常量进行范围检查,但为什么这样:'ch - = 65;'?不要使用神奇数字!为什么不简单地使用'isalpha'作为支票? – Olaf