比如输入一下 abcdddszxcaad求a,b,c个个字母的个数
你好,代码已经给出,请耐心分析代码中的逻辑,详细注释已经给出,方法多样,我这个只是其中一种,码字不易,望采纳!
const char * count_char_num(const char * ptr)
{
if(NULL == ptr) //空字符串,根本不需要算
return ptr;
char *str = (char*)malloc(strlen(ptr)+1); //记录已经记录过个数的字符,strlen需要调用#include<string.h>
//strlen求一个字符串的长度,加一是因为strlen没有把字符串最后面的'\0'算进去
char *left = str;
char *right = str; //代替str进行循环
int number = 1; //记录个数,初始化为1是因为计数时第一个出现的字符没有算进去
const char *pl = ptr;
const char *pr = ptr + 1;
while(1){
while(left != right){ //进入是否已经算过的判断语句,注意:第一次并不会进入这个while循环,因为第一次
//str字符串并未存入字符,此时left和right指向的地址是一样的
if((*left) == (*pl)){
if( *(pl+1) == '\0') //如果相等,且已经到了最后一个字符,结束函数
return ptr;
left = str; //如果相等,但没到最后一个字符,函数继续,left重置便于下次判断
++ pl; //右移,判断下一位
}
else
++ left; //当前不相等,则往下比
}
//只要出来while函数,即代表存在还未计数的字符
left = str; //left重置
pr = pl + 1;
//还没算过,记录
(*right) = (*pl);
++ right;
//开始计算
//此时pr=pl+1
while((*pr) != '\0'){
if((*pl) == (*pr))
++ number;
++ pr;
}
printf("%c出现了%d次\n",*pl,number);
number = 1; //重置number为1
++ pl; //右移,当前字符已经计算完毕,继续判断下一个字符
}
return ptr;
}
int main()
{
const char * p = "aaccaabbdddbb";
count_char_num(p);
return 0;
}
你可以写俩数组
mySmallLettercount[26];
myBigLettercount[26];
里头全是0
取出每个位置的字符 strzifu
判断是大写还是小写
if(strzifu>'a' && strzifu<'z')
mySmallLettercount[strzifu-‘a’]++;
strzifu-‘a’ 就是小写字母应该对应的计数位置了
同理 大写字母也可以这样计数了