C ++:在int数组的最后一个元素中存储数据时遇到问题

时间:2011-11-06 01:35:22

标签: c++ arrays

下面的代码读入一个文件,然后计算'a','b'等数字......字符,它将'A'和'a'都计为同一个字母。

以下代码有效;但是,如果我将int数组count [26] = {0}的声明更改为count [25] = {0}(并且只更改此值),程序将无法正确存储'z'字符的数量,这是存储在数组的第25个元素中。它将在第25个元素中存储-1。我不明白为什么?我从不访问count [26],只计算[0]到count [25],但为什么我必须在数组中再添加一个元素才能使代码工作?当count为26个元素时,正确数量的'z'字符存储在count [25]中。

int main (int argc, char *argv[], char **env)
{
// Declare variables

int c, big ;
int count[26] = {0} ;
int bar[25] = {0} ;
ifstream infile("histo.data") ;

while (!infile.eof())
{

        c = infile.get() ;
        c = tolower(c) ;

      if ( c >= 97 && c <= 122)
      {
         count[c - 'a']++ ;
      }

}
infile.close() ;

for (int i = 0; i <= 25; i++)
{
    printf("%c: %d\n",(97+i),count[i]) ;
}


// find largest letter count
big = count[0] ;

for (int i = 1; i <= 25; i++)
{

    if(count[i] > big)
    {
      big = count[i] ;
    }
}

// bar lengths
int cols  = atoi(getenv("COLUMNS")) ;
for (int i = 0; i <= 25; i++)
    {
        bar[i] = (cols-3)*count[i]/big ;
    }

// print bars

for (int i = 0; i <= 25; i++)
{
    printf("\n%c: ",(97+i));
    for (int j = 1; j <= bar[i]; j++)
    {
        cout << "=" ;
    }
}

cout << "\n" << endl ;
}

2 个答案:

答案 0 :(得分:2)

数组是零索引的,但是您声明它们的数字是数组的 size 。因此,如果你想要26个项目,你需要声明一个26的数组。虽然索引范围是0 ... 25。

答案 1 :(得分:1)

count[25]声明一个大小为25的数组,而不是最后一个索引为25的数组。因为数组是零索引的,所以数组中的最后一个合法索引比长度小一个。有26个字母,所以你需要一个长度为26的数组,声明为count[26]