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

我的代码是这样写的,可是为什么运行的时候,两个连在一起的字符就出错了?#include"stdio.h"#include"string.h"#defineN100stru... 我的代码是这样写的,可是为什么运行的时候,两个连在一起的字符就出错了?#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;} 展开
 我来答
问明6E
高粉答主

2019-05-20 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:12.9万
展开全部

#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;)。

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

风若远去何人留
2017-05-08 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450131
专业C/C++软件开发

向TA提问 私信TA
展开全部

一、算法分析:

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

然后输入字符串。

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

输出结果。

二、参考代码:

#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
iorijj
2017-02-24 · TA获得超过443个赞
知道小有建树答主
回答量:457
采纳率:66%
帮助的人:151万
展开全部

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

自己考虑

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1269589562
2017-02-24 · TA获得超过215个赞
知道小有建树答主
回答量:197
采纳率:93%
帮助的人:102万
展开全部

您好!

你既然已经对每个新出现的字符建立了一个结构体数组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;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
判官从二官无7
2017-02-24 · 超过19用户采纳过TA的回答
知道答主
回答量:49
采纳率:0%
帮助的人:11.2万
展开全部
数字也可以是字符
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式