统计指定字符在主串中出现的次数

(数据结构)C实现的课后习题:统计指定字符在主串中出现的次数

具体要求:
输入以回车作为结束符的一串字符作为主串;求主串中指定字符(包括单个字符、子串、单词)出现的次数和位置,注意单词与子串的区别;

假设 num 存放出现次数,初始化为 0 , position[i] 存放每一次匹配时的位置。

  1. 编写一个菜单函数,根据不同情况做( 0-3 )不同选择
  2. 如果选择 1 ,即要求匹配的是单个字符 c ,让 i=0 ,依次比较主串的第 i 个字符,如果 s[i]==c,则匹配成功, position[num]=i;num++;
  3. 如果选择 2 ,即要求匹配的是子串 t ,则此算法即为模式匹配算法,与模式匹配不同的是每次匹配成功时不是返回,而是设置 position 和 num 的值, position[num]=i-j;num++;
  4. 如果选择 3 ,即要求匹配的是单词 t ,假设主串中单词之间用空格分割,与 t 匹配的子串必须是一个单词,因此首先要找出主串中的单词,然后让 t 与找到的单词比较,若结果相等,则匹配成功,设置 position 和 num 的值, position[num]=i-j; num++; 否则,查找主串中的下一个单词,直到主串结束。

代码如下:
#include “string.h”
#include “stdio.h”
char str[60];
index_string(char *s,char t) / 子串匹配函数 /
{int i,j,num=0,position[80];
/num 存放匹配个数, position 中存放每一次匹配的位置 /
i=0;j=0;
while(s[i]!=’\0’) /
主串没有结束 /
{while(s[i]!=’\0’&&t[j]!=’\0’) /
没有遇到结束符 /
if(s[i]==t[j]) /
继续 /
{i++;
j++;}
else /
回溯 /
{i=i-j+1;
j=0;
}
if(t[j]==’\0’)
{position[num]=i-j;num++;j=0;} /
匹配成功,存放位置,并且次数加 1
/
}
if(num) /
如果匹配成功,输出匹配次数和位置 */
{printf("\nthe number of string “%s” is %d",t,num);
printf("\nthe position is:");
for(i=0;i<num;i++)
printf("%5d",position[i]);
printf("\n");}
else
printf("\n the string is not found!",i);
}
index_word(char *s,char t)
{int i,j,num=0,position[80];
char word[20];
i=j=0;
while(s[i]!=’\0’)
{j=0;
while(s[i]==’ ‘)
i++;
while((s[i]!=’ ‘)&&(s[i]!=’\0’)) /
寻找主串中的单词 /
word[j++]=str[i++];
word[j]=’\0’;
if(strcmp(t,word)==0) /
如果输入的单词与主串中的单词匹配 /
{position[num]=i-j;num++;}
}
if(num) /
如果匹配成功,输出匹配次数和位置 */
{
printf("\nthe number of word “%s” is %d",t,num);
printf("\nthe position is:");
for(i=0;i<num;i++)
printf("%5d",position[i]);
printf("\n");
}
else
printf("\n the word is not found!");
}
index_char(char *s,char t)
{
int i=0,num=0,position[80];
while(s[i]!=’\0’)
{if(s[i]==t) {position[num]=i;num++;}
i++;}
if(num)
{
printf("\nthe number of char ’ %c’ is %d",t,num);
printf("\nthe position is:");
for(i=0;i<num;i++)
printf("%5d",position[i]);
printf("\n");
}
else
printf("\n the char is not found!");
}

void menu() /* 菜单选择函数 /
{char choice,c;
char t[20];
printf(" 指定类型 \n");
printf("\n");
printf(“1. 单个字符 \n”);
printf(“2. 指定子串 \n”);
printf(“3. 指定单词 \n”);
printf(“0. 退出 \n”);
printf("
\n");
do
{
printf(" 请你在上述功能中选择 (0-3) : ");
choice=getchar();
getchar();
switch(choice)
{case ‘1’:printf("input char : "); /
指定单个字符匹配的情况 /
c=getchar();getchar();
index_char(str,c);
break;
case ‘2’:printf("input string : "); /
指定子串匹配的情况 /
gets(t);
index_string(str,t);break;
case ‘3’:printf("input word : "); /
指定单词匹配的情况 */
gets(t);
index_word(str,t);break;
case ‘0’:return;
}
}while(1);
}
int main()
{
printf("\ninput the string1 : ");
gets(str);
menu();
}

具体的代码就是这样,剩下的上机实现的话,自己拷贝上去手动实现吧。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值