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中。
展开
 我来答
仙戈雅3n
推荐于2016-11-19 · TA获得超过5791个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:932万
展开全部
#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);
}
AepKill
2014-09-14
知道答主
回答量:12
采纳率:0%
帮助的人:12.3万
展开全部

字符串匹配问题

简单的就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;
}

//自己弄文件输出

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d580670
2014-09-14 · TA获得超过1983个赞
知道大有可为答主
回答量:2054
采纳率:82%
帮助的人:730万
展开全部
#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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鐂姝篨
2014-09-14 · 超过54用户采纳过TA的回答
知道答主
回答量:161
采纳率:0%
帮助的人:128万
展开全部
排序算法错误。
if(input[j]>input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
input越界。n个数只需要比较n-1次,就能找到最大的。
追问
你在说什么
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式