c语言大神来帮我看一道题目。输入一个字符串统计其中各个字符出现的次数。

这是我自己写的#include"stdio.h"#include"string.h"
main()
{char a[100],b[100];
int c[100]={0},i,j,m=0,n,k,l=1;
printf("请输入字符并以回车结束:\n");
gets(a);
n=strlen(a);
b[0]=a[0];
for(j=1,i=1;j<n;j++)
{for(k=0;k<j;k++)
if(a[j]==a[k]) m++;
if(m==0)
{b[i]=a[j];
i++;}
}
for(j=0;j<i;j++)
for(m=0;m<n;m++)
if(b[j]==a[m]) c[j]++;

for(j=0;j<i;j++)

printf("%c,%d\n",b[j],c[j]);
}

为什么我在运行的时候总是出一点小错误像这个里头没有f的个数。程序我看了好多遍了我感觉没错啊。

#include"stdio.h"
#include"string.h"
main()
{char a[100],b[100];
int c[100]={0},i,j,m=0,n,k,l=1;
printf("请输入字符并以回车结束:\n");
gets(a);
n=strlen(a);
b[0]=a[0];
for(j=1,i=1;j<n;j++)
{for(k=0;k<j;k++)
if(a[j]==a[k]) m++;
if(m==0)
{b[i]=a[j];
i++;}
else
m=0; //这里m需要归零,你给出的例子,asd刚开始都只出现一次,m始终为0,所以asd都能搜进b数组,但后面a重复出现,m变为非0,并且没有清零,导致遍历到f时m还是非零值,后面的d已经在数组b里出现,所以不影响d的最终统计
}
for(j=0;j<i;j++)
for(m=0;m<n;m++)
if(b[j]==a[m]) c[j]++;
for(j=0;j<i;j++)
printf("%c,%d\n",b[j],c[j]);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-16
我大概看懂了你的思路,你是先找到所有出现的字符,存到 b[],然后统计出现次数。
for(j=1,i=1;j<n;j++)
{
m = 0; //你应该在这里添加一个语句,当标志位用。

for(k=0;k<j;k++)
if(a[j]==a[k]) m++; //这里还可以写成 {m=1; break;}
if(m==0)
{
b[i]=a[j];
i++;
}
}

如果当字符多的时候,这个方法就不太好了,有比这个好方法追问

感谢你的回答。加上 {m=1; break;}这句能简化程序!谢谢

第2个回答  2013-04-16
兄弟,这种小程序,多加几个printf在中间,实时打印几个关键数值
最后对比下就能知道哪里错了

别人看你的程序,又没注释,硬生生的要去理解你的思路,很累的
第3个回答  2013-04-16
for(j=1,i=1;j<n;j++)
{
m=0;//这里重置下m的值。
for(k=0;k<j;k++)
if(a[j]==a[k]) m++;
if(m==0)
{b[i]=a[j];
i++;}
相似回答