c语言统计字符串中每个字符出现的次数

我的代码是这样写的,可是为什么运行的时候,两个连在一起的字符就出错了?#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(){ printf(" 请输入一串字符:"); gets(str); len=strlen(str); int i,j; int a,flag; a=0; for(i=0;i<len;i++) { flag=0; 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++; } } n=a; printf(" 出现的字符 出现的频数\n"); for(i=0;i<a;i++) { printf(" %c %d\n",let[i].data,let[i].count); } return 0;}

#include&lt;stdio.h&gt;

#include&lt;stdlib.h&gt;

int findsub(char*src,char*s)

{

char*ptr=src,*p=s;//定义两个指针

char*ptr2=src+strlen(src),*prev=NULL;//ptr2为src的末位置指针

int len=strlen(s),n=0;//子串的长度和计数器

for(;*ptr;ptr++)//循环整个串

{

if(ptr2-ptr&lt;len)//如果一开始子串就大于src,则退出

break;

for(prev=ptr;*prev==*p;prev++,p++)//寻找第一个相等的位置,然后从此位置开始匹配子串

{

if(*(p+1)==0||*(p+1)==10)//如果已经到了子串的末尾

{

n++;//自增

p=s;//重新指向子串

break;//退出

}

}

}

return n;

}

int main(void)

{

char a[81],b[81];//定义两个字符数组

printf("输入原字符串:");

fgets(a,81,stdin);//输入

printf("输入子字符串:");

fgets(b,81,stdin);

printf("找到:%d\n",findsub(a,b));

system("pause");

return 0;

}

扩展资料:

①printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。

格式输出,它是c语言中产生格式化输出的函数(在stdio.h中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。

要输出的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。

简单点理解就是,在一段程序中你正确使用该函数,可以在该程序运行的时候输出你所需要的内容。

②printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。

printf()函数的调用格式为:printf("&lt;格式化字符串&gt;",&lt;参量表&gt;)。

其中格式化字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-05-08

一、算法分析:

要统计每个字符出现的个数,那么就要为每个字符做一个统计值,可以用数组实现。

然后输入字符串。

遍历字符串,对每个字符进行统计。

输出结果。

二、参考代码:

#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;
}

第2个回答  2017-02-24

逻辑错了,按照你输入的字符串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'

自己考虑

第3个回答  2017-02-24

您好!

你既然已经对每个新出现的字符建立了一个结构体数组let来存储

那么,在判断每一个新字符时,你应该对比的是已存储的let数组,而不是之前的字符串

因为你这里“let[j].count++;”j的位置和前面相同字母在let数组中的位置并不相同

改成如下代码即可:

#include "stdio.h"
#include "string.h"
#define N 100

struct 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;
}

本回答被提问者采纳
第4个回答  2017-02-24
数字也可以是字符