#include <stdio.h> #include <string.h> #define MAXLEN 100 void CreateString(char str[]) { printf("请输入目标串:"); scanf_s("%s", str); } void PrintString(char str[]) { printf("%s\n", str); } int BFMatch(char s[], char t[]) { int i = 0, j = 0; int sLen = strlen(s); int tLen = strlen(t); while (i < sLen && j < tLen) { if (s[i] == t[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j == tLen) { return i - j + 1; } else { return -1; } } int main() { char s[MAXLEN]; char t[MAXLEN]; int pos; CreateString(s); printf("请输入模式串:"); scanf_s("%s", t); pos = BFMatch(s, t); if (pos == -1) { printf("匹配不成功!\n"); } else { printf("匹配成功,位序为:%d\n", pos); } return 0; }以上代码的思路
时间: 2024-02-14 08:08:26 浏览: 135
以上代码是一个基于 BF(暴力匹配)算法的字符串匹配程序。其中,CreateString() 函数用于输入目标串,PrintString() 函数用于输出字符串,BFMatch() 函数用于匹配模式串。具体实现为,从目标串的第一个字符开始尝试匹配模式串,如果匹配成功则继续匹配下一个字符,否则从目标串的下一个字符重新开始匹配。如果匹配成功,则返回匹配的起始位置,否则返回 -1。在 main() 函数中,先调用 CreateString() 函数输入目标串,再输入模式串,并调用 BFMatch() 函数进行匹配,最终输出匹配结果。
相关问题
练习-编写函数输入一批字符串,输出其中最长的字符串.#include <stdio.h> #include<string.h> #define M 100 #define N 80 void inputarr (char array[ ][N] , int n); int maxlenstr (char array[ ] [N] , int n); int mystrlen(const char str[ ]);
下面是一个实现输入一批字符串,输出其中最长的字符串的示例代码:
```
#include <stdio.h>
#include <string.h>
#define M 100
#define N 80
void inputarr(char array[][N], int n);
int maxlenstr(char array[][N], int n);
int mystrlen(const char str[]);
int main() {
char array[M][N];
int n, maxlen;
printf("请输入字符串个数:");
scanf("%d", &n);
inputarr(array, n);
maxlen = maxlenstr(array, n);
printf("最长的字符串是:%s\n", array[maxlen]);
return 0;
}
void inputarr(char array[][N], int n) {
int i;
printf("请输入%d个字符串:\n", n);
for (i = 0; i < n; i++) {
scanf("%s", array[i]);
}
}
int maxlenstr(char array[][N], int n) {
int i, maxlen = 0, maxindex = 0;
for (i = 0; i < n; i++) {
if (mystrlen(array[i]) > maxlen) {
maxlen = mystrlen(array[i]);
maxindex = i;
}
}
return maxindex;
}
int mystrlen(const char str[]) {
int len = 0;
while (str[len] != '\0') {
len++;
}
return len;
}
```
这个程序中,首先定义了一个二维字符数组 `array`,用于存储输入的字符串。然后通过 `inputarr()` 函数输入这些字符串。接着,通过 `maxlenstr()` 函数找到其中最长的字符串所在的位置,最后输出该字符串即可。
需要注意的是,在输入字符串时,我们使用了 `scanf()` 函数,这个函数可以读取以空格或回车分隔的字符串,但是如果输入的字符串中有空格,那么空格后面的内容就会被忽略。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXLEN 255 typedef struct{ char ch[MAXLEN]; int length; }SString; bool SubString(SString &sub,SString S,int pos,int len){ if(pos+len-1>S.length) return false; for(int i = pos;i<pos+len;i++) sub.ch[i-pos+1]=S.ch[i]; sub.length=len; return true; } //串比较 int StrCompare(SString S,SString T){ for(int i=1;i<=S.length&&i<=T.length;i++){ if(S.ch[i]!=T.ch[i]) printf("%d",S.ch[i]-T.ch[i]); } printf("%d",S.length-T.length); } //求串长 int StrLength(SString S){ return S.length; } //定位 int Index(SString S,SString T){ int i=1,n=StrLength(S),m=StrLength(T); SString sub; while(i<n-m+1){ SubString(sub,S,i,m); if(StrCompare(T,sub)!=0) ++i; else return i; } return 0; } //打印字符串 void printSString(SString str) { int i; for(i=1;i<=str.length;i++) printf("%c",str.ch[i]); printf("\n"); } int main(){ SString A; A.ch[1]='a'; A.ch[2]='b'; A.ch[3]='c'; A.ch[4]='d'; A.ch[5]='e'; A.ch[6]='f'; A.ch[7]='g'; A.ch[8]='h'; A.ch[9]='i'; A.length = 9; SString B; B.ch[1]='a'; B.ch[2]='b'; B.ch[3]='c'; B.ch[4]='d'; B.ch[5]='e'; B.length = 5; Index(A,B); }
这段代码是一个简单的串操作代码,主要包括子串获取、串比较、求串长和定位等功能。代码中定义了一个结构体SString来表示字符串,通过定义不同的函数来实现不同的操作。
函数SubString用于获取字符串S中从位置pos开始长度为len的子串,并存储在结构体sub中。
函数StrCompare用于比较两个字符串S和T,依次比较对应位置上的字符,如果不相等则输出它们的ASCII码差值,如果长度不相等则输出它们的长度差值。
函数StrLength用于求字符串S的长度。
函数Index用于在字符串S中定位字符串T第一次出现的位置,通过循环遍历S中所有可能的子串,并与T比较,如果找到相等的子串则返回其起始位置。
在main函数中,创建了两个SString类型的字符串A和B,并给它们赋初值。然后调用Index函数,在字符串A中查找字符串B第一次出现的位置。
最后,需要注意的是代码中存在一些问题,比如在函数StrCompare的循环中没有加上循环条件判断,函数Index中的循环条件应该是i<n-m+1而不是i<=n-m+1。此外,在main函数最后没有返回值。
阅读全文