c语言统计字符串中每个字符出现的次数
4个回答
展开全部
逻辑错了,按照你输入的字符串aabbccddeeffgg
a的统计不会有问题,但是后面的都会出错
for(i=0;i<len;i++){ flag=0; //这里开始,前面两个a不会出错 //第一个a不进内部循环,let[0]会被赋值 //第二个a进入内部循环,在j为0时给let[0].count自增,并跳出循环 //第三个b进入内部循环,找不到相同字母,跑完循环,let[1]会被赋值 //第四个b进入内部循环,在j为2时给let[2].count自增 //但是实际上此时let[2]是没有数据的,你应该是给let[1].count自增 for(j=0;j<i;j++) { if(str[i]==str[j]) { flag=1; let[j].count++; break; } } if(!flag) { let[a].data=str[i]; let[a].count++; a++; }}错误就像上面写的那样
其实你这个方法对那些交叉排列的字符来说,更加不好进行统计
如果你要输入的字符是某一个集合,你完全可以用一个长度为字符集大小的数组来保存各字符的出现次数
比如全为小写字母时,你可以声明一个int cnt[26]
数组的下标可以标识字符,0 == 'a' - 'a'、1 == 'b' - 'a'、...、25 == 'z' - 'a'
自己考虑
a的统计不会有问题,但是后面的都会出错
for(i=0;i<len;i++){ flag=0; //这里开始,前面两个a不会出错 //第一个a不进内部循环,let[0]会被赋值 //第二个a进入内部循环,在j为0时给let[0].count自增,并跳出循环 //第三个b进入内部循环,找不到相同字母,跑完循环,let[1]会被赋值 //第四个b进入内部循环,在j为2时给let[2].count自增 //但是实际上此时let[2]是没有数据的,你应该是给let[1].count自增 for(j=0;j<i;j++) { if(str[i]==str[j]) { flag=1; let[j].count++; break; } } if(!flag) { let[a].data=str[i]; let[a].count++; a++; }}错误就像上面写的那样
其实你这个方法对那些交叉排列的字符来说,更加不好进行统计
如果你要输入的字符是某一个集合,你完全可以用一个长度为字符集大小的数组来保存各字符的出现次数
比如全为小写字母时,你可以声明一个int cnt[26]
数组的下标可以标识字符,0 == 'a' - 'a'、1 == 'b' - 'a'、...、25 == 'z' - 'a'
自己考虑
展开全部
一、算法分析:
要统计每个字符出现的个数,那么就要为每个字符做一个统计值,可以用数组实现。
然后输入字符串。
遍历字符串,对每个字符进行统计。
输出结果。
二、参考代码:
#include <stdio.h>int main(){ int cnt[128]={0};//用来统计个数。 char str[200];//存储字符串。 int i; gets(str);//输入字符串。 for(i = 0; str[i]!='\0'; ++i)//遍历字符串。 cnt[str[i]]++;//统计个数。 for(i=0;i<128; i ++)//遍历统计到的值。 if(cnt[i]!=0)//如果出现过则打印值,及个数。 printf("%c:%d\n", i, cnt[i]);//输出结果。 return 0;}
要统计每个字符出现的个数,那么就要为每个字符做一个统计值,可以用数组实现。
然后输入字符串。
遍历字符串,对每个字符进行统计。
输出结果。
二、参考代码:
#include <stdio.h>int main(){ int cnt[128]={0};//用来统计个数。 char str[200];//存储字符串。 int i; gets(str);//输入字符串。 for(i = 0; str[i]!='\0'; ++i)//遍历字符串。 cnt[str[i]]++;//统计个数。 for(i=0;i<128; i ++)//遍历统计到的值。 if(cnt[i]!=0)//如果出现过则打印值,及个数。 printf("%c:%d\n", i, cnt[i]);//输出结果。 return 0;}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
您好!
你既然已经对每个新出现的字符建立了一个结构体数组let来存储
那么,在判断每一个新字符时,你应该对比的是已存储的let数组,而不是之前的字符串
因为你这里“let[j].count++;”j的位置和前面相同字母在let数组中的位置并不相同
改成如下代码即可:
#include "stdio.h"#include "string.h"#define N 100struct letter{ char data; int count;}let[N];char str[N]={0};int len; //字符的长度int n; //字符的个数int main(){ int i,j; int a,flag; printf(" 请输入一串字符:"); gets(str); len=strlen(str); a=0; for(i=0;i<len;i++) { flag=0; /*---------------------------------------------------------------*/ for(j=0;j<a;j++) { //修改处:i改为a if(str[i]==let[j].data) { //修改处:str[j]改为let[j].data flag=1; let[j].count++; break; } } /*---------------------------------------------------------------*/ if(!flag) { let[a].data=str[i]; let[a].count++; a++; } } n=a; printf(" 出现的字符 出现的频数\n"); for(i=0;i<a;i++) { printf(" %c %d\n",let[i].data,let[i].count); } getchar();getchar(); return 0;}
你既然已经对每个新出现的字符建立了一个结构体数组let来存储
那么,在判断每一个新字符时,你应该对比的是已存储的let数组,而不是之前的字符串
因为你这里“let[j].count++;”j的位置和前面相同字母在let数组中的位置并不相同
改成如下代码即可:
#include "stdio.h"#include "string.h"#define N 100struct letter{ char data; int count;}let[N];char str[N]={0};int len; //字符的长度int n; //字符的个数int main(){ int i,j; int a,flag; printf(" 请输入一串字符:"); gets(str); len=strlen(str); a=0; for(i=0;i<len;i++) { flag=0; /*---------------------------------------------------------------*/ for(j=0;j<a;j++) { //修改处:i改为a if(str[i]==let[j].data) { //修改处:str[j]改为let[j].data flag=1; let[j].count++; break; } } /*---------------------------------------------------------------*/ if(!flag) { let[a].data=str[i]; let[a].count++; a++; } } n=a; printf(" 出现的字符 出现的频数\n"); for(i=0;i<a;i++) { printf(" %c %d\n",let[i].data,let[i].count); } getchar();getchar(); return 0;}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数字也可以是字符
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询