人们!
我在C中声明数组有一个问题。我必须用Java编写一个小程序,它显示文本文件中每个字母的数量以及字母总数。为了进一步教育自己,我也写了C中的每一个作业。在Java中它完全有用,所以我想我对C中的数组有很大的误解。
我声明了一个大小为26的int数组。所以我认为编译器为26个整数分配内存。我的输出是printf("%d",alphabet[m]);
的简单for循环。但我得到了奇怪的结果。有些索引是正确的,有些索引中有很多索引,有些索引也有负数。如果我将数组大小更改为int alphabet[2500];
它完全可以解决,但我没有任何线索为什么......它没有任何意义,因为对于索引26,他应该分配26个整数。显然它是有道理的,否则它将无法工作。有人提示我,我会很感激!
该文本总共有5000个字符(不包括空格),如果这很重要,每个字母的平均数量约为150-200个。
我的代码:
int len;
int alphabet[26];
int m;
FILE *handler;
if(handler!=NULL)
{
for(m=0;m<=25;m++)
{
char buffer = 0;
handler=fopen("text.txt","r");
while((buffer=fgetc(handler)) != EOF)
{
if(buffer==(char)65+m)
{
alphabet[0+m]++;
}
if(isalpha(buffer))
{
len++;
}
}
fclose(handler);
}
}
[... else print(error)and fclose ...]
for(m=0;m<=25;m++)
{
printf("[%c] n: %5d \n",65+m,alphabet[m]);
}
答案 0 :(得分:3)
您确实声明了正确大小的数组,但您没有初始化它。这意味着它可能充满了随机数据。在使用++
运算符之前,请务必将其全部设置为零:
int alphabet[26] = { 0 };
答案 1 :(得分:1)
可能还有其他错误,但代码的一个大问题是,在尝试通过应用修复后增量运算符++
来修改数组之前,不会初始化数组的元素。这是未定义的行为,这可以解释&#34;奇怪的结果&#34;。您可以对数组的所有元素进行零初始化,如下所示:
int alphabet[26] = {0};
答案 2 :(得分:0)
除了关于初始化阵列的答案(这是至关重要的,这些都是很好的答案),你想要重新安排你的逻辑。您可以拥有输入的每个新字符&#34; drive&#34;而不是循环遍历字母表中的每个元素。的东西。对于每个角色,检查它是否是字母表的候选者并相应地调整计数。 现在,通过在for
循环中循环使用字母表,您完成所有操作26次,这是不必要的。
所以你需要的唯一循环是while循环。