本文主要是介绍百度改错题:统计数组中a-z的个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天师妹问我一个百度笔试的题,说找错。程序大概意思是实现统计数组中a-z的个数(凭记忆)。原题目程序如下:
#include <iostream>
using namespace std;
void foo(char a[250],int cnt[50]);int main()
{
char a[250]="百度abc";
int cnt[50];
foo(a,cnt);
return 0;
}void foo(char a[250],int cnt[50])
{memset(cnt,0,sizeof(cnt));
while(*a!='\0')
{
++cnt[*a];
++a;
}
for(char c='a';c<='z';++c)
{
cout<<c<<cnt[c]<<endl;
}
}
1、程序有个明显的错误,memset在foo函数中,sizeof(cnt)=4,显然初始化不正确。但是需要注意的是,如果memset是在main函数中,如int cnt[50];memset(cnt,0,sizeof(cnt));这样sizeof(cnt)=200;
2、另外,cnt[*a]没有考虑中文是两个字节组成的,如果a数组中全是字母还好说,如果像这里面有中文,那*a就不知道是什么数了,所以我认为应该加个条件,因为是统计a-z的个数,所以应该限定if (*a<='z' && *a >= 'a') {++cnt[*a];}3、cnt[50]初始看好像可以,但是50太小了,因为这个程序在输出的时候写的cnt[c],如果c='a',那其实就是cnt[97],所以cnt[50]做声明是不够的,至少应该大于'z'。后来师妹说这可能是她记错了,可能题目原来就是cnt[250],那就不存在这个错误了。
下面是我改后的程序:
#include <iostream>
using namespace std;
void foo(char a[250],int cnt[50]);int main()
{
char a[250]="百度abc";
int cnt[250];
foo(a,cnt);
return 0;
}void foo(char a[250],int cnt[250])
{
memset(cnt,0,sizeof(cnt)*250);
while(*a!='\0')
{
if (*a<='z' && *a >= 'a')
{
++cnt[*a];
}
++a;
}
for(char c='a';c<='z';++c)
{cout<<c<<cnt[c]<<endl;
}
}
这篇关于百度改错题:统计数组中a-z的个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!