在C中声明Array的大小

时间:2015-04-12 22:37:47

标签: c arrays

人们!

我在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]);
}

3 个答案:

答案 0 :(得分:3)

您确实声明了正确大小的数组,但您没有初始化它。这意味着它可能充满了随机数据。在使用++运算符之前,请务必将其全部设置为零:

int alphabet[26] = { 0 };

答案 1 :(得分:1)

可能还有其他错误,但代码的一个大问题是,在尝试通过应用修复后增量运算符++来修改数组之前,不会初始化数组的元素。这是未定义的行为,这可以解释&#34;奇怪的结果&#34;。您可以对数组的所有元素进行零初始化,如下所示:

int alphabet[26] = {0};

答案 2 :(得分:0)

除了关于初始化阵列的答案(这是至关重要的,这些都是很好的答案),你想要重新安排你的逻辑。您可以拥有输入的每个新字符&#34; drive&#34;而不是循环遍历字母表中的每个元素。的东西。对于每个角色,检查它是否是字母表的候选者并相应地调整计数。 现在,通过在for循环中循环使用字母表,您完成所有操作26次,这是不必要的

所以你需要的唯一循环是while循环。