100 Days of Code-day28-查找模式-自主实现strstr函数功能

查找模式的具体功能如上一篇所示。

#include<stdio.h>
#define MaxSize 100

int getline(char *s, int maxlen);
const char* mystrstr(const char *str1, const char *str2);

int main(int argc, char *argv[])
{
   int found = 0;
   char line[MaxSize];

   if (argc != 2)
   	printf("Usage:find pattern\n");
   else
   {
   	while (getline(line, MaxSize) > 0)
   	{
   		if (mystrstr(line, argv[1]) != NULL)
   		{
   			printf("%s", line);
   			found++;
   		}
   	}
   }
   printf("%d", found);
   return found;
}

int getline(char *s,int maxlen)
{
   char c;
   char *temps = s;

   while (-- maxlen > 0 && (c = getchar())!=EOF && c != '\n')
   {//--maxlen是为了给换行符留出空间
   	*s++ = c;
   }
   if (c == '\n')
   	*s++ = c;
   *s = '\0';
   return s - temps;
}

const char * mystrstr(const char *s1, const char *s2)
{
   int i, j, k, len2, count = 0;

   for (len2 = 0; *(s2 + len2) != '\0'; len2++)
   	; //len2 becomes the length of s2
   for (i = 0; *(s1 + i) != '\0'; i++)
   {
   	if (*(s1 + i) == *s2)
   	{
   		for (j = i, k = 0; *(s2 + k) != '\0'; j++, k++)
   		{
   			if (*(s1 + j) == *(s2 + k))
   				count++;
   			else count = 0;
   			if (count == len2)
   			{
   				return s1 + i;
   			}
   		}
   	}
   }
   return NULL;
}

mystrstr的灵感来源:https://stackoverflow.com/questions/3850241/my-strstr-returning-null-even-if-the-string-to-be-found-is-at-the-index-0

对上述mystrstr函数进行修改之后,使其结构更加紧凑。

const char *mystrstr(const char *s1, const char *s2)
{
	int i, len, count = 0, j, k;

	for (len = 0; *(s2 + len) != '\0'; len++)
		;
	for (i = 0; *(s1 + i); i++)
	{
		for (j = i, k = 0; *(s2 + k) && *(s1 + j) == *(s2 + k); j++, k++)
				count++;
		if (k == 0 || *(s2 + k))
			count = 0;
		if (count == len)
			return s1 + i;
	}
	return NULL;
}

在终端上的执行结果:

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值