问答题
请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“ z”26个字母各自出现的次数,并依次放在pp所指数组中。
例如:当输入字符串abcdefghabcdeabc后,程序的输出结果应该是:33322110000000000000000000
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <conio.h>
#include <stdio.h>
void fun (char*tt, int pp[])
{
}
main()
{
char aa[1000];
int bb[26], k, n;
clrscr();
printf("/nPlease enter a char string: ") ;
scanf("%s",aa);
fun(aa,bb);
for (k=0 ;k<26 ; k++)
printf("%d ",bb[k]) ;
printf("/n ");
}
【正确答案】
【答案解析】void fun(char*tt,int pp[] )
{
int i;
fori=0;i<26;i++)
pp[i]=0; /*初始化pp数组各元素为0*/
for(;*tt!='/0';tt++)
if(*tt>='a'&&*tt<='z')
pp[*tt-'a']++; /*将tt字符串中'a'到'z'26个字母各自出现的次数,依次放在pp数组中,任一个小写字
母减去'a'后所得结果正好是它对应的下标*/
}
[解析] 第1个循环的作用是初始化数组pp,未经赋值变量的量为一个不确定数字。由于它要将'a'到'z'26个字母的个数依次放到数组pp中。即'a'的个数存于pp[0]中,'b'的个数存于pp[1]中,'c'的个数存于pp[2]中,…,依次类推。而'a'-'a'的值正好为0,'b'-'a'的值为1,'c'-'a'的值为2,…,依此类推。即任一个小写字母减去'a'后所得结果正好是它对应的下标,所以就有了pp[*tt-'a']++。但*tt必须是小写字母即if()不应省略。