题目:输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧
思路:通过字符串匹配子串bf算法查找帧头和帧尾,输出合法帧
程序如下:
#include<stdio.h>
#include<string.h>void legalstr(char * str, char *head,char *tail,int headl,int taill);
char * s_gets(char *st, int n);
int main()
{
char str1[40];
char head[20];
char tail[20];
int headl,taill;
printf("输入长度小于40的字符串:");
s_gets(str1, 40);
printf("输入长度小于20的帧头:");
s_gets(head,20);
headl = strlen(head);
printf("输入长度小于20的帧尾:");
s_gets(tail, 20);
taill = strlen(tail);
legalstr(str1, head,tail,headl,taill);
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
int i = 0;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
while (st[i] != '\n'&&st[i] != '\0')
i++;
if (st[i] == '\n')
st[i] = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val;
}
void legalstr(char * str, char *head, char *tail, int headl, int taill)
{
int i, j;
int hlocat, tlocat;
i = 0;
j = 0;
while (str[i] != '\0')
{
if (str[i] == head[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
if (j == headl)
{
hlocat = i - j;
j = 0;
break;
}
}
while (str[i] != '\0')
{
if (str[i] == tail[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
if (j == taill)
{
tlocat = i;
j = 0;
}
}
printf("合法帧:");
for (i = hlocat; i < tlocat; i++)
printf("%c", str[i]);
printf("\n");
}
结果:
输入长度小于40的字符串:asdasdq23qwedqwdzzcx
输入长度小于20的帧头:asd
输入长度小于20的帧尾:qwd
合法帧:asdasdq23qwedqwd
请按任意键继续. . .