关于BF算法的C语言实现

关于BF算法的C语言实现,第1张

我修改的程序都是把S[0] T[0]转换为strlen(S) strlen(T)函数来实现的

为什么不把strlen(S),strlen(T)分别赋予S[0],T[0],害怕覆盖原来的数据吗?没有必要,他们原本就是来存储这个数据的,君不见,它们都不参与匹配正搭!他们的初始化应该在这个函数之外完成,在每次数组长度改变后,就及时设置,换句话说,在调用这个函数之前,应该保证他们已经设置正确,

在打印时,应该从第二个元素S[1]或T[1]开始,因为S[0],T[0]不再是数组的实际内容

不知道我有没有表述清楚,

一般,数组的第一个元素存放实际的内容,而你这里并不是这样,数组的第一个元素不再是数组的实际内容,而是数组长度

==================================================================

补充

比较大小时S[0]的值不就变成了整形的ASCII码值了么?

1.整数就是整数,没有ASCII码,ASCII码是针对字符

2.在C中,整数赋予字符变量是合法的

2.在C中,字符与举迟拿整数的关系运算也是合法的,当你要把一个字节的数解释成字符的时旦槐候,它就是字符,可他存储的还是数啊,就把它当整数用吧,毕竟我们没有打算打印它,当然它能表示的整数太少了,所以数组长度受到限制

如果你要以字符显示它,那它当然是那个整数所对应的字符,如果那是可打印字符的话

int Index(SString S,SString T,int pos)

{ /* 返回子串T在主串S中野磨如第pos个字符颂启之后的位置。若不存在,则函数值为0。 */

/* 其中,T非游源空,1≤pos≤StrLength(S)。算法4.5 */

int i,j

if(1<=pos&&pos<=S[0])

{

i=pos

j=1

while(i<=S[0]&&j<=T[0])/*S[0],T[0]中存放的为串长*/

if(S[i]==T[j]) /* 继续比较后继字符 */

{

++i

++j

}

else /* 指针后退重新开始匹配 */

{

i=i-j+2

j=1

}

if(j>T[0])

return i-T[0]

else

return 0

}

else

return 0

}

引用没问题,就是BF函数错了。

#include<stdio.h>

#include<string.h>消桐

#include<iostream>备扮//.h去掉

using namespace std//命名空间

int BF(char S[],char T[])

{

int i,j,start

i=0

j=0

start=0

while(S[i]!='\0'&&T[j]!='\0')//T[i]改为T[j]

{

if(S[i]==T[j])

{

i++j++

}

else{

start++

i=start

j=0

}

}

if(T[j]=='\0')

return start+1//start+1,因为数组从0开始计数

else

return 0

}

int main()

{

char S[1000],T[1000]

int start

printf("输入主串:\n"仿桥灶)

scanf("%s",S)

printf("%s\n",S)

printf("输入子串: \n ")

scanf("%s",T)

printf("%s\n",T)

start=BF(S,T)

cout<<"主串与子串在主串的第"<<start<<"个字符匹配"<<endl

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12337768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存