为什么不把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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)