今天在图书馆老胡突然给我出题
在C语言里面写个能够统计并打印字符串中字符出现次数
心想这不是常规操作吗?
“定义两个char数组,输入,赋值给另一个字符数组
通过一个for循环嵌套两个for循环,比较,相同的值数组赋值=’*’。
然后判断当数组值不等于0的时候和原数组进行比较再打印输出”
我的代码
#include<stdio.h>#include<string.h>#define maxsize 100int main(void){char s[maxsize],s1[maxsize];scanf("%s",s);for(int i=0,length=strlen(s);i<length;++i){s1[i]=s[i];}for(int i=0,length=strlen(s);i<length;++i){for(int j=i+1;j<length;++j){if(s[i]==s[j]){s1[j]='*';}}if(s1[i]!='*'){int number=0;for(int k=0;k<length;++k){if(s1[i]==s[k]){++number;}}printf("%c出现次数:%d\n",s1[i],number);}}}
运行正确
##但是老胡的方法更为简单粗暴,直接利用相同字符对应的数字一样作为数组下标,进行自加
想法很新颖,代码也少……服了
#include<stdio.h>#include<string.h>#define maxsize 100int main(void){char s[maxsize];scanf("%s",s);int asc[127]={0};//a-z字符对应ASCII码表小写字母97-122,大写字母是 65-90,小写大写相差32 for(int i=0,length=strlen(s);i<length;++i){asc[int(s[i])]++;//对应的ASCII码下标加1,同一个字母对应的下标都相同,进行计数 } for(int j=0;j<123;++j){if(asc[j]!=0){printf("字母%c出现次数:%d\n",j,asc[j]);}} }
但是这个程序还有个不好的地方,没有按照输入字符串的顺序打印,而是从A-Z a-z打印的
emmm……
我觉得C的输入输出太麻烦还是C++好
哈哈哈!