前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言根据协议分割获取字符串单元

C语言根据协议分割获取字符串单元

作者头像
杨源鑫
发布2019-07-04 15:54:36
1.1K0
发布2019-07-04 15:54:36
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈

第一次用MarkDown写公众号文章,希望多多支持,技术也需要升级!

协议做如下规定

规定数据协议:

代码语言:javascript
复制
序列号    长度    状态字    数据长度   数据1   数据2    数据3

以空格作为数据单元。 例如:

代码语言:javascript
复制
00001 00007 1   3  34567 26358 32698   
 (1)   (2) (3) (4)  (5)   (6)   (7)

以上各个编号字段代表的基本含义如下:

代码语言:javascript
复制
(1)00001就是数字1,即代表序列号为1

(2)00007就是数字7,即代表长度为7

(3)1代表状态字

(4)3代表数字长度

(5)34567代表数据1

(6)26358代表数据2

(7)32698代表数据3

这样就找到规律了,假设数据都为整型或者负整型,我们就可以根据这个规则来实现以下代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//根据空格拆分字符串 
int partition(char *src, char *par, int pos)
{
  int i,j;
  i = pos;
  //取得一个非空字符 
  while(src[i] == ' ')
    ++i;
  if(src[i] != '\0')
  {
    j = 0;
    while((src[i] != '\0') && (src[i] != ' '))
    {
        //判断条件是否满足 
        if((src[i] > '9') || (src[i] < '0') && (src[i] != '-'))
            return -1 ;
      par[j] = src[i];
      ++i;
      ++j;
    }
    par[j]='\0';
    return i;
  }
  else
    return -1;
}

int main(void)
{
    int serial_number ;
    int lenght ;
    int status ;
    int data_length;
    int data1,data2,data3; 

    int position = 0;
    int para_flag = 1 ; 
    int parameter_item = 0;
    char partition_string[20] = {0};
    char *data = "00001 00007 1 3 34567 26358 32698"; 
    while(para_flag)
    {
        if(para_flag == 0)
            break ; 
        if((position = partition(data,partition_string,position)) != -1)
        {
            ++parameter_item ;
            switch(parameter_item)
            {
                case 1:
                    serial_number = atoi(partition_string);
                    break ;
                case 2:
                    lenght = atoi(partition_string);
                    break ;
                case 3:
                    status = atoi(partition_string);    
                    break ;
                case 4:
                    data_length = atoi(partition_string);   
                    break ;
                case 5:
                    data1 = atoi(partition_string); 
                    break ;
                case 6:
                    data2 = atoi(partition_string); 
                    break ;
                case 7: 
                    data3 = atoi(partition_string); 
                    para_flag = 0 ;
                    break ;
            }
        }
    }
    printf("序号:%d\n",serial_number);
    printf("长度:%d\n",lenght);
    printf("状态字:%d\n",status);
    printf("数据长度:%d\n",data_length);
    printf("数据1:%d\n",data1);
    printf("数据2:%d\n",data2);
    printf("数据3:%d\n",data3);
    return 0;   
} 

运行结果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式开发圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 协议做如下规定
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档