【20180829】【C/C++基础知识】复习match函数程序

例5:实现匹配函数match:程序在输入字符串中查找一个给定的字符,如果找到,则从该字符开始打印余下的子字符串,及该字符是字符串的第几个字符;否则输出“no match found”。

拓展:在输入字符串s2中查找s1字符串。

第一次写的程序:

/* match函数:在s2中查找s1,并输出s1之后的所有字符 */
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
char *match();   // 函数声明
char *match(char a[50],char b[100])    // 实现搜索的功能
{
	char *p1=a,*p2=b,*p;
	int i,len1,posit=0,locat=0;
	for(i=0;p1!='\0';p1++)  // 求s1长度,便于后面找s2中出现s1的位置
		i++;
	len1=i+1;   // 错误2!!!
	p1=a; p2=b; 

	while(p2!='\0')   // 错误1!!!
	{
		if(*p1!=*p2)
		{
			p2++;
			posit++;
			p1=a;
		}
		else
		{
			while((*p2==*p1)&&(p1!='\0'))
			{
				p1++;
				p2++;
				posit++;
			}
		}
		if(*p1=='\0')
		{
			locat=posit-len1;
			p=&(b[locat]);
		}
		else
			p=NULL;
	}
	return p;

}
int main()    // 定义一些变量,获取字符串,调用match函数,进而做下一步操作
{
	char s1[50],s2[100],*p;
	printf("s1:\n");
	gets_s(s1,50);
	printf("s2:\n");
	gets_s(s2,100);
	p=match(s1,s2);
	if(p)
		printf("%s\n",p);
	else
		printf("No match found!\n");


	system("pause");
	return 0;
}

我的错误:

(1)没有分清楚*p和p的区别,要判断字符串是否到了'\0'或者判断两个字符串是否相同,都要用*p!!!

(2)求s1长度len1时求错!调试看区别:i++放在for语句表达式3中和放在for语句循环体内,结果是不同的!

(3)在s2中搜索到s1后,应当结束搜索并输出打印后面的所有字符,但大的循环体的条件是*p2!='\0',所以在搜索到s1后,其实还是依然在进行循环的,这里错误,所以应当再加一个限制条件!

 

修改后的程序可实现正确功能:

/* match函数:在s2中查找s1,并输出s1之后的所有字符 */
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
char *match();   // 函数声明
char *match(char a[50],char b[100])    // 实现搜索的功能
{
	char *p1=a,*p2=b,*p;
	int i,len1,posit=0,locat=0;
	for(i=0;*p1!='\0';p1++)  // 求s1长度,便于后面找s2中出现s1的位置
		                    // 错误3!!!
		i++;
	len1=i;   // 错误2!!!
	p1=a; p2=b; 

	while((*p2!='\0')&&(*p1!='\0'))   // 错误1!!!
	{
		if(*p1!=*p2)
		{
			p2++;
			posit++;
			p1=a;   // 目的是:若搜索到s1的首字母,但中途又和s1不一样了,就要从s1的首字母重新开始搜索!
		}
		else
		{
			while((*p2==*p1)&&(p1!='\0'))
			{
				p1++;
				p2++;
				posit++;
			}
		}
		
	}
	if(*p1=='\0')
	{
		locat=posit-len1;
		p=&(b[locat]);   // p是指针,因此存放地址,所以应当是数组的地址,而不是&(locat),这样会出现类型错误!
	}
	else
		p=NULL;
	return p;

}
int main()    // 定义一些变量,获取字符串,调用match函数,进而做下一步操作
{
	char s1[50],s2[100],*p;
	printf("s1:\n");
	gets_s(s1,50);
	printf("s2:\n");
	gets_s(s2,100);
	p=match(s1,s2);
	if(p)
		printf("%s\n",p);
	else
		printf("No match found!\n");


	system("pause");
	return 0;
}

 

 

心得:

(1)为了逻辑清晰,思维不混乱,最好在编写程序之前先用自然语言简洁描述,或者用伪代码表示出来,还要结合画图分析!

(2)借助调试技术

 

开心♪(^∀^●)ノ

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值