题目:查找子串(BF算法)
C语言标准函数库中包括 strstr 函数,在主串中查找子串。作为练习,我们自己编写一个功能与之相同的函数。
函数原型
char* StrStr(const char *txt, const char *pat);
说明:txt 和 pat 分别为主串和子串的起始地址。若查找成功,则函数值为子串在主串中首次出现的起始地址,否则函数值为NULL。
特别地,我们对C语言库函数strstr进行适当修改:若子串为空串,则没有意义,函数值规定为NULL。
裁判程序
#include <stdio.h>
#include <string.h>
char* StrStr(const char *txt, const char *pat);
int main()
{
char m[1024], s[1024], *p;
gets(m);
gets(s);
p = StrStr(m, s);
if (p)
{
printf("%d\n", p - m);
}
else
{
puts("NULL");
}
return 0;
}
/* 你提交的代码将被嵌在这里 */
输入样例1
This is a pencil is |
输出样例1
2 |
输入样例2
This is a pencil be |
输出样例2
NULL |
参考源码
// 码者注 const类似于define定义 为一种相较于宏定义的一种定义方式 特点灵活
// 码者注 在源码中 const 会导致编译器发出警告 去除后即可 本次提交不删
/* 查找子串 */
char* StrStr(const char* txt, const char* pat) {
int m, n, i, j;
m = n = i = j = 0;
// 注:'\0' 表 NULL
// 获取 txt 与 pat 的长度
while (txt[m] != '\0') {
m++;
}
while (pat[n] != '\0') {
n++;
}
// 无输入情况
if(m == 0){
return NULL;// 子串为0 返回空指针
}
if(n == 0){
return NULL;// 子串为0 返回空指针
}
// 类似链表中查找操作 稍作改动
// 查询
while (i < m && j < n) {
if (txt[i] == pat[j]) {
i++; j++; // 往下对比 判断是否多位也满足
}
else {
i++; j = 0; // i 往前一位 j 退位为 0 重新比较
}
}
// 判断是否完全匹配
//当 j == n 完全与 txt 匹配 返回地址
if(j == n) {
return &(txt[i-j]);
}
return NULL;// 不匹配 返回控制针
}
整体实现
#include <stdio.h>
#include <string.h>
char* StrStr(const char *txt, const char *pat);
int main()
{
char m[1024], s[1024], *p;
gets(m);
gets(s);
p = StrStr(m, s);
if (p)
{
printf("%d\n", p - m);
}
else
{
puts("NULL");
}
return 0;
}
/* 你提交的代码将被嵌在这里 */
// 码者注 const类似于define定义 为一种相较于宏定义的一种定义方式 特点灵活
// 码者注 在源码中 const 会导致编译器发出警告 去除后即可 本次提交不删
/* 查找子串 */
char* StrStr(const char* txt, const char* pat) {
int m, n, i, j;
m = n = i = j = 0;
// 注:'\0' 表 NULL
// 获取 txt 与 pat 的长度
while (txt[m] != '\0') {
m++;
}
while (pat[n] != '\0') {
n++;
}
// 无输入情况
if(m == 0){
return NULL;// 子串为0 返回空指针
}
if(n == 0){
return NULL;// 子串为0 返回空指针
}
// 类似链表中查找操作 稍作改动
// 查询
while (i < m && j < n) {
if (txt[i] == pat[j]) {
i++; j++; // 往下对比 判断是否多位也满足
}
else {
i++; j = 0; // i 往前一位 j 退位为 0 重新比较
}
}
// 判断是否完全匹配
//当 j == n 完全与 txt 匹配 返回地址
if(j == n) {
return &(txt[i-j]);
}
return NULL;// 不匹配 返回控制针
}