我的代码是这样写的,可是为什么运行的时候,两个连在一起的字符就出错了?#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<stdio.h>
#include<stdlib.h>
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<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("<格式化字符串>",<参量表>)。
其中格式化字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。
一、算法分析:
要统计每个字符出现的个数,那么就要为每个字符做一个统计值,可以用数组实现。
然后输入字符串。
遍历字符串,对每个字符进行统计。
输出结果。
二、参考代码:
#include <stdio.h>逻辑错了,按照你输入的字符串aabbccddeeffgg
a的统计不会有问题,但是后面的都会出错
for(i=0;i<len;i++)错误就像上面写的那样
其实你这个方法对那些交叉排列的字符来说,更加不好进行统计
如果你要输入的字符是某一个集合,你完全可以用一个长度为字符集大小的数组来保存各字符的出现次数
比如全为小写字母时,你可以声明一个int cnt[26]
数组的下标可以标识字符,0 == 'a' - 'a'、1 == 'b' - 'a'、...、25 == 'z' - 'a'
自己考虑
您好!
你既然已经对每个新出现的字符建立了一个结构体数组let来存储
那么,在判断每一个新字符时,你应该对比的是已存储的let数组,而不是之前的字符串
因为你这里“let[j].count++;”j的位置和前面相同字母在let数组中的位置并不相同
改成如下代码即可: