最近在重温c语言与数据结构,敲了一边c代码,实现c语言库函数strstr功能,strstr库函数返回指针,编写的strindex(s,t)返回位置是字符串t在s中的最左位置,代码如下
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[],int max);
int strindex(char source[],char searchfor[]);
char pattern[]="hello";
main()
{
char line[MAXLINE];
int found=0;
while (getline(line,MAXLINE)>0)
if (strindex(line,pattern)>=0){
printf("%s",line);
found++;
}
return found;
}
int getline(char s[], int lim)
{
int c,i;
i=0;
while (--lim>0 && (c=getchar()) != EOF && c!='\n')
s[i++]=c;
if (c=='\n')
s[i++]=c;
s[i] = '\0';
return i;
}
int strindex(char s[], char t[])
{
int i,j,k;
for(i=0;s[i] !='\n';i++){
for (j=i,k=0;t[k]!='\0' && s[j]==t[k];j++,k++)
;
if (k>0 && t[k] =='\n')
return i;
}
return -1;
}
那么我们还可以试试写出下面的这种函数来:编写函数strindex(s,t),它返回字符串t在s中最右边出现位置。如果s中不包含t,则返回-1.
可以这么理解,如果遍历成功找到了字符串t,返回最右边的位置其实就是最左边的位置+字符串t的长度,这样根据上面的算法就很容易编写新算法如下:
int strindex(char s[], char t[])
{
int i,j,k;
for(i=0;s[i] !='\n';i++){
for (j=i,k=0;t[k]!='\0' && s[j]==t[k];j++,k++)
;
if (k>0 && t[k] =='\n')
return i+k-1;
}
return -1;
}
《参考c语言程序设计第二版》