例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)借助调试技术