下面的代码读入一个文件,然后计算'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 ;
}
答案 0 :(得分:2)
数组是零索引的,但是您声明它们的数字是数组的 size 。因此,如果你想要26个项目,你需要声明一个26的数组。虽然索引范围是0 ... 25。
答案 1 :(得分:1)
count[25]
声明一个大小为25的数组,而不是最后一个索引为25的数组。因为数组是零索引的,所以数组中的最后一个合法索引比长度小一个。有26个字母,所以你需要一个长度为26的数组,声明为count[26]
。