![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
c语言问题,急求
1.编写strrindex()函数函数原型:intstrrindex(chars[],chart[],int*pos);函数功能:形参s指向母串,形参t指向子串,函数判断...
1. 编写 strrindex()函数
函数原型:int strrindex(char s[],char t[],int *pos);
函数功能:形参s指向母串,形参t指向子串,函数判断s指向的母串中是否包含t指向的子串,如果包含,则将子串最后一次出现的位置保存到形参pos指向的变量中,函数的返回值为子串出现的次数;如果母串中不包含子串,则函数返回0。
2. 编写main函数
函数功能:声明字符数组用于存放子串和母串,声明整型变量存放子串出现的次数以及最后一次出现的位置,从键盘输入母串和子串,调用strrindex()函数进行分析,分析完成后在main()函数中将分析结果输出到屏幕和文件out.txt中。最后将考生本人学号输出到文件out.txt中。 展开
函数原型:int strrindex(char s[],char t[],int *pos);
函数功能:形参s指向母串,形参t指向子串,函数判断s指向的母串中是否包含t指向的子串,如果包含,则将子串最后一次出现的位置保存到形参pos指向的变量中,函数的返回值为子串出现的次数;如果母串中不包含子串,则函数返回0。
2. 编写main函数
函数功能:声明字符数组用于存放子串和母串,声明整型变量存放子串出现的次数以及最后一次出现的位置,从键盘输入母串和子串,调用strrindex()函数进行分析,分析完成后在main()函数中将分析结果输出到屏幕和文件out.txt中。最后将考生本人学号输出到文件out.txt中。 展开
4个回答
展开全部
#include<stdio.h>
#include <string.h>
// 采用子串定位策略算法
int strrindex(char s[],char t[],int *pos){
int cHead[100]; // 计算子串首字母在母串的分布位置
int i; // 循环用的变量
int hLen=-1; // 记录定位到子串首字母的数量
int subLen=strlen(t); // 子串的长度
int mainLen=strlen(s);// 母串的长度
int findCount=0; // 找到的字串的数量
int curIndex=0; // 匹配时用要移动的下标
char cFirst=t[0]; // 子串首字母
bool isALL; // 匹配子串是否存在母串
for(i=0;i<100;i++) cHead[i]=-1;
for (i=0;i<mainLen;i++){
if(s[i]==cFirst) cHead[++hLen]=i; // 计算子串首字母在母串的分布位置
}
if(hLen<0) return 0; // 母串不存在这样的子串
for (i=cHead[curIndex];i<mainLen;)
{
isALL=false;
for(int j=0;j<subLen;j++)
{
if(t[j]==s[i+j]) isALL=true;
else{
isALL=false;
break;
}
}
if (isALL)
{
findCount++;
*pos=i; // 保存子串最后一次出现的位置(下标)
}
curIndex++;
if(cHead[curIndex]!=-1) i=cHead[curIndex];
else i++;
}
return findCount; // 返回子串出现的次数
}
int main(void){
int i=0;
printf("子串在母串出现的次数:%d",strrindex("abcdkenefgkenweoia","ken",&i));
printf("\n最后一次字串在母串的位置:%d\n",i);
}
展开全部
字符串匹配问题
简单的就BF算法
快点就Kmp,BM算法
给你一KMP算法的实现:
#include <stdio.h>
#include <string.h>
// 在 a 中的第 pos 之后的位置找 b 串
int kmp(char *a, char *b, int pos)
{
int next[50] = {0};
int lena = strlen(a);
int lenb = strlen(b);
int i, j;
// 生成改进的 next 数组
// a a a b
// -1 0 1 2 原来的情况
// -1 -1 -1 2 改进后的
next[0] = -1; // -1 表示不能再回溯 j 了
j = -1; // 开始 j==-1 表示字符串到头了,
i = 0; // i 从第一个字符开始
while (i < lena)
{
if (j == -1 || b[i] == b[j])
{
i++; j++;
if (b[i] == b[j]) next[i] = j;
else next[i] = next[j];
}
else j = next[j]; // 匹配失败时, 回到 next[j]
}
// 开始 kmp 算法
i = pos;
j = 0;
while (i < lena && j < lenb)
{
if (j == -1 || a[i] == b[j]) {i++; j++;}
else j = next[j]; // 回溯 j 指针
}
if (j == lenb) return i - j + 1;
return -1;
}
int main(void)
{
char a[500];
char b[100];
int flag;
int pos;
printf("请输入主串: ", a);
gets(a);
printf("请输入模式串: ");
gets(b);
printf("请输入开始匹配位置: ");//输入0就从头开始匹配
scanf("%d", &pos);
flag = kmp(a, b, pos-1);
if (flag >= 0)
printf("匹配成功!\n位置: %d\n", flag);
else
printf("匹配失败!\n");
return 0;
}
//自己弄文件输出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
int strindex(const char* p, const char* c, int *pos)
{
const char* cp = p;
const char* cc = c;
const char* sp = p;
int cnt = 0;
if (!p || !c || !pos) return 0;
while (*p)
{
if (*p == *c){
cp = p+1;
cc = c+1;
while (*cc && *cc == *cp){cc++; cp++;}
if (! *cc){
*pos = p - sp;
cnt++;
printf("got %s\n", p);
if (*cp){
p = cp;
continue;
}
}
if (! *cp) return cnt;
}
p++;
}
return cnt;
}
int main()
{ int cnt;
int pos = 0;
cnt = strindex("aa abc abcabcabcdefabc", "abc", &pos);
if (cnt)
printf("%d %d\n", cnt, pos);
cnt = strindex("aa abcacab", "aa", &pos);
if (cnt)
printf("%d %d\n", cnt, pos);
return 0;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
排序算法错误。
if(input[j]>input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
input越界。n个数只需要比较n-1次,就能找到最大的。
if(input[j]>input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
input越界。n个数只需要比较n-1次,就能找到最大的。
追问
你在说什么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询