输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来. 提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhau

  1. #include<stdio.h>  
  2. #include<string.h>  
  3.   
  4. int head_flog = 0;//用于标记找到尾的标志  
  5. int tail_flog = 0;//用于标记找到头的标志  
  6.   
  7. char *tail(char *s, char *b)//找到tail地址  
  8. {  
  9.     int num = 0;//计数字符长度,和b比较  
  10.     int len_b;  
  11.     char *temp = b;//用于返回尾地址值的指针  
  12.   
  13.     len_b = strlen(b);//b的长度  
  14.   
  15.     if((NULL == s) || (NULL == b))//s,b为空,返回空地址  
  16.     {  
  17.         return NULL;  
  18.     }  
  19.   
  20.     if(strlen(s) < strlen(b) )//s长度小于b长度,返回空地址  
  21.     {  
  22.         return NULL;  
  23.     }  
  24.     if(head_flog != 0)//找到头后,在开始找尾  
  25.     {  
  26.         while((*s != '\0') && (!tail_flog))//*s不为空,且未找到尾  
  27.         {  
  28.             while(*s == *temp)  
  29.             {  
  30.                 s++;  
  31.                 temp++;  
  32.                 num++;  
  33.                 if(num == len_b)//找到尾,赋值尾地址值和找到尾的标记  
  34.                 {  
  35.                     tail_flog = 1;  
  36.                     temp = s -1;  
  37.                     break;  
  38.                 }  
  39.             }  
  40.             if((num != 0)&&(num != len_b))//伪尾部,重新赋值找  
  41.             {  
  42.                 num = 0;  
  43.                 temp = b;  
  44.                 s--;//若伪尾部和真尾连续,则s指针要后退  
  45.             }  
  46.             s++;  
  47.         }  
  48.     }  
  49.     if(tail_flog != 0)//找到尾,返回尾地址值  
  50.     {  
  51.         return temp;  
  52.     }  
  53.     else  
  54.     {  
  55.         printf("string illgeal!\n");  
  56.         return NULL;  
  57.     }  
  58. }  
  59.   
  60. char *head(char *s, char *a)//找到head的地址  
  61. {  
  62.     int num = 0;//计数字符长度,用于和a长度比较  
  63.     int len_a;  
  64.     char *temp = a;//用于返回头地址值的指针  
  65.   
  66.     len_a = strlen(a);//字符a长度  
  67.   
  68.     if ((NULL == s) ||(NULL == a))//s,a为空,返回空指针  
  69.     {  
  70.         return NULL;  
  71.     }  
  72.   
  73.     if (strlen(s) < strlen(a))//s长度小于a的长度,返回空指针  
  74.     {  
  75.         return NULL;  
  76.     }  
  77.   
  78.     while ((*s != '\0') && (!head_flog))//*s不为空,且未找到头  
  79.     {  
  80.         while(*s == *temp)  
  81.         {  
  82.             s++;  
  83.             temp++;  
  84.             num++;  
  85.             if(num == len_a)//找到头部,赋值头指针值和找到头的标记  
  86.             {  
  87.                 head_flog = 1;  
  88.                 temp = s - len_a;  
  89.                 break;  
  90.             }  
  91.         }  
  92.         if((num != 0)&&(num != len_a))//伪头部,重新赋值找  
  93.         {  
  94.             num = 0;  
  95.             temp = a;  
  96.             s--;//若伪头和真头连续,则s要指针后退  
  97.         }  
  98.         s++;  
  99.     }  
  100.   
  101.     if(head_flog != 0)//找到头,返回头地址值  
  102.     {  
  103.         return temp;  
  104.     }  
  105.     else  
  106.     {  
  107.         printf("string illgeal!\n");  
  108.     }  
  109. }  
  110.   
  111. int main()  
  112. {  
  113.     char s[100];  
  114.     char a[5];  
  115.     char b[5];  
  116.     int n;//保存有效字符的长度  
  117.     int i;  
  118.     char *start = NULL;  
  119.     char *end = NULL;  
  120.   
  121.     printf("Enter string(<=100)!\n");  
  122.     scanf("%s",s);  
  123.     printf("Enter head string(<=5)!\n");  
  124.     scanf("%s",a);  
  125.     printf("Enter tail string(<=5)!\n");  
  126.     scanf("%s",b);  
  127.   
  128.     start = head(s,a);//开始地址  
  129.     end = tail(s,b);//结束地址  
  130.     n = end - start + 1;  
  131.   
  132.     if (n > 0)//tail在head的后面,存在有效数据,否则无效  
  133.     {  
  134.         for (i = 0; i < n; i++)  
  135.         {  
  136.             printf("%c",*start);  
  137.             start++;  
  138.         }  
  139.         printf("\n");  
  140.     }  
  141.     else  
  142.     {  
  143.         printf("No data!\n");  
  144.     }  
  145.   
  146.     return 0;  
  147. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值