简单LinuxC程序关于实现识别字符串中合法的帧(字符串输入)

题目: 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.

例如:帧头和帧尾分别是head和tail  字符串”hdbchddheadhfdjhfdtailvcgbfgby”中headhfdjhfdtail是合法帧。


解析:在我看来,该题目有两种理解方式。

一种是字符串中第一个tail作为帧尾,源代码如下:
#include <stdio.h>
#include <string.h>
#define MAX 100

int head_tail (char ch[],char head[],char tail[])
{
	int strl1 = strlen(ch);
	int strl2 = strlen(head);
	int strl3 = strlen(tail);
	int temp_head,temp_tail;
	int i,j;

	for (i = 0; i < (strl1 - strl2); i++)
	{
		for (j = 0; j < strl2; j++)
		{
			if (ch[i + j] != head[j])   //比较字符串和帧头
			{
				break;
			}
		}
		if (j == strl2)    //判断字符串中有没有帧头
		{
			temp_head = i;    //记录下帧头的位置
			for (i = i + j; i < (strl1 - strl3); i++)
			{
				for (j = 0; j < strl3; j++)
				{
					if (ch[i + j] != tail[j])     //比较字符串和帧尾
					{
						break;
					}
				}
				if (j == strl3)        //判断字符串中有没有帧尾
				{
					temp_tail = i + j;           //记录下帧尾的位置
                	printf ("legal string is :");
					for (i = temp_head; i < temp_tail; i++ )
					{
						printf ("%c",ch[i]);     //输出合法帧
					}
					return 0;
				}
			}	
			printf ("can not find the %s",tail);   //找不到帧尾

			return 0;;
		}
	}
	printf ("can not find the %s",head);         //找不到帧头

	return 0;
}

int main()
{
	char ch[MAX];
	char head[MAX];
	char tail[MAX];
	int i = 0;

	printf ("input a string:");
	fgets (ch,MAX,stdin);          
	/*使用scanf时,一旦遇到空格,就会认为是下一次的输入,这样就无法
	从键盘上获取带空格的字符串,使用gets()或fgets(),而gets()会无限
	读取键入的数据,所以有很大的风险。使用fgets()比较安全,第一个参
	数是字符型指针,指向用来存储所得数据的地址;第二个参数是整型数
	据,指明存储数据的大小;第三个参数是文件结构体指针,将要读取的
	文件流,这里的stdin是标准输入*/

	printf ("input a head string:");
	fgets (head,MAX,stdin);
	while (head[i] != '\0')
	{
		if (head[i] == '\n')
		{
			head[i] ='\0';
		}
		i++;
	}
	/*fgets()会将换行符也读入,而我们显然不希望字符串中有换行符,
	使用以上代码可将换行符换成'\0',作为字符串的结尾*/
	i = 0;

	printf ("input a tail string:");
	fgets (tail,MAX,stdin);
	while (tail[i] != '\0')
	{
		if (tail[i] == '\n')
		{
			tail[i] ='\0';
		}
		i++;
	}

	head_tail (ch,head,tail);

	printf("\n");

    return 0;
}



另一种是字符串最后一个tail作为帧尾,源代码如下:
#include <stdio.h>
#include <string.h>
#define MAX 100

int head_tail (char ch[],char head[],char tail[])
{
	int strl1 = strlen(ch);
	int strl2 = strlen(head);
	int strl3 = strlen(tail);
	int temp_head,temp_tail;
	int i,j;
	int flag = 0;

	for (i = 0; i < (strl1 - strl2); i++)
	{
		for (j = 0; j < strl2; j++)
		{
			if (ch[i + j] != head[j])
			{
				break;
			}
		}
		if (j == strl2)
		{
			temp_head = i;
			for (i = i + j; i < (strl1 - strl3); i++)
			{
				for (j = 0; j < strl3; j++)
				{
					if (ch[i + j] != tail[j])
					{
						break;
					}
				}
				if (j == strl3)
				{
					temp_tail = i + j;
					flag = 1;
				}
			}
			if (flag == 1)     //判断是否找到帧尾,此时如果找到,temp_tail保存的是最后一个tail的位置
			{
            	printf ("legal string is :");
				for (i = temp_head; i < temp_tail; i++ )
				{
					printf ("%c",ch[i]);
				}
				return 0;
			}

			printf ("can not find the %s",tail);

			return 0;
		}
	}
	printf ("can not find the %s",head);

	return 0;
}

int main()
{
	char ch[MAX];
	char head[MAX];
	char tail[MAX];
	int i = 0;

	printf ("input a string:");
	fgets (ch,MAX,stdin);

	printf ("input a head string:");
	fgets (head,MAX,stdin);
	while (head[i] != '\0')
	{
		if (head[i] == '\n')
		{
			head[i] ='\0';
		}
		i++;
	}
	i = 0;

	printf ("input a tail string:");
	fgets (tail,MAX,stdin);
	while (tail[i] != '\0')
	{
		if (tail[i] == '\n')
		{
			tail[i] ='\0';
		}
		i++;
	}

	head_tail (ch,head,tail);

	printf("\n");

    return 0;
}

       需要注意的是,使用scanf时,一旦遇到空格,就会认为是下一次的输入,这样就无法从键盘上获取带空格的字符串,使用gets()或fgets(),而gets()会无限读取键入的数据,所以有很大的风险。使用fgets()比较安全,第一个参数是字符型指针,指向用来存储所得数据的地址;第二个参数是整型数据,指明存储数据的大小;第三个参数是文件结构体指针,将要读取的文件流,这里的stdin是标准输入。fgets()会将换行符也读入,而我们显然不希望字符串中有换行符,使用一些方法(前文代码中有)可将换行符换成'\0',作为字符串的结尾。
       字符串的结尾是一个重点,在很多的编程中都要涉及,处理不好字符串的结尾,肯定无法处理好字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值