C语言简单数据解析

C语言简单数据解析

​ 在嵌入式开发中通过串口等传输数据通常使用JSON解析,虽然JSON十分强大,但JSON耗费资源太多,数据的打包和解析都比较麻烦。有时我们只是传输一些简单的数据,没必要引入JSON。

​ 下面我将介绍一种简单的数据解析方法,通过编写函数,将字符串解析取得目标数据。

解析字符型数据

函数原型

/**
  * @brief  从一段字符串中解析期望的字符串
  * @param  pBuff: 要解析的字符串地址
  * @param  pLeft: 目标字符串左边的字符串
  * @param  pRight: 目标字符串右边的字符串
  * @param  pRes: 接收字符数据的地址
  * @retval 0:成功 -1:失败
  */
int DataParsingChar(const char *pBuff, const char *pLeft, const char *pRight,char *pRes)
{
    char *pBegin = NULL;
    char *pEnd = NULL;
    pBegin = strstr(pBuff, pLeft);
    pEnd = strstr(pBegin + strlen(pLeft), pRight);
    if (pEnd == NULL || pBegin == NULL || pBegin > pEnd) {
        return -1;
    } else {
        pBegin += strlen(pLeft);
        memcpy(pRes, pBegin, pEnd - pBegin);
        return 0;
    }
}

此函数思想是使用strstr函数找出目标字符串的首尾位置,使用memcpy函数将目标字符串拷贝给接收数据的指针。

测试代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int DataParsingChar(const char *pBuff, const char *pLeft, const char *pRight,char *pRes)
{
    char *pBegin = NULL;
    char *pEnd = NULL;
    pBegin = strstr(pBuff, pLeft);
    pEnd = strstr(pBegin + strlen(pLeft), pRight);
    if (pEnd == NULL || pBegin == NULL || pBegin > pEnd) {
        return -1;
    } else {
        pBegin += strlen(pLeft);
        memcpy(pRes, pBegin, pEnd - pBegin);
        return 0;
    }
}

int main(int argc, char **argv)
{
    /* 原始数据 */
    char *name = "LiHua";
    int age = 20;
    int number = 10086;

    char buff[100] = {0};
    char re_name[10] = {0};
    char re_age[10] = {0};
    char re_number[10] = {0};

    /* 数据打包 */
    sprintf(buff,"name:%s, age:%d, number:%d.",name, age, number);
    
    /* 数据解析 */
    DataParsingChar(buff, "name:", ",", re_name);
    DataParsingChar(buff, "age:", ",", re_age);
    DataParsingChar(buff, "number:", ".", re_number);

    printf("buff : %s\n", buff);
    printf("re_name : %s\n", re_name);
    printf("re_age : %s\n", re_age);
    printf("re_number : %s\n", re_number);

    return 0; 
}

执行结果

buff : name:LiHua, age:20, number:10086.
re_name : LiHua
re_age : 20
re_number : 10086

在测试代码中,使用sprintf将数据打包,通过传入标识符来获取目标数据。

在有些情况,我们希望在字符串中获取整型数据,例如坐标数据等,可以直接拿来运算使用,对上面的解析函数稍加更改,就可以解析整型数据。

解析整型数据

函数原型

/**
  * @brief  从一段字符串中提取出整型数据
  * @param  pBuff: 要解析的字符串地址
  * @param  pLeft: 目标数据左边的字符串
  * @param  pRight: 目标数据右边的字符串
  * @param  pRes: 接收整型数据的地址
  * @retval 0:成功 -1:失败
  */
int DataParsingInt(const char *pBuff, const char *pLeft, const char *pRight, int *pRes)
{
    char *pBegin = NULL;
    char *pEnd = NULL;
    char *pTemp = NULL;
    pBegin = strstr(pBuff, pLeft);
    pEnd = strstr(pBegin + strlen(pLeft), pRight);
    if (pEnd == NULL || pBegin == NULL || pBegin > pEnd) {
        return -1;
    } else {
        pBegin += strlen(pLeft);
        pTemp = (char *)malloc(pEnd - pBegin);
        memcpy(pTemp, pBegin, pEnd - pBegin);
        *pRes = atoi(pTemp);
        free(pTemp);
        return 0;
    }
}

在上面的代码中,增加了atoi函数。此函数经常用于Linux应用开发中,将终端输入的数字型的字符串转换为整型变量(int类型)。在不清楚数字长度的情况下使用malloc分配内存,若传输简短数据可替换成数组,增加代码运行效率。

测试代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int DataParsingInt(const char *pBuff, const char *pLeft, const char *pRight, int *pRes)
{
    char *pBegin = NULL;
    char *pEnd = NULL;
    char *pTemp = NULL;
    pBegin = strstr(pBuff, pLeft);
    pEnd = strstr(pBegin + strlen(pLeft), pRight);
    if (pEnd == NULL || pBegin == NULL || pBegin > pEnd) {
        return -1;
    } else {
        pBegin += strlen(pLeft);
        pTemp = (char *)malloc(pEnd - pBegin);
        memcpy(pTemp, pBegin, pEnd - pBegin);
        *pRes = atoi(pTemp);
        free(pTemp);
        return 0;
    }
}

int main(int argc, char **argv)
{
    /* 原始数据 */
    int left = 123;
    int right = 456;

    char buff[100] = {0};
    int re_left = 0;
    int re_right = 0;

    /* 数据打包 */
    sprintf(buff, "[%d,%d]", left, right);
    
    /* 数据解析 */
    DataParsingInt(buff, "[", ",", &re_left);
    DataParsingInt(buff, ",", "]", &re_right);

    printf("buff : %s\n", buff);
    printf("re_left : %d\n", re_left);
    printf("re_right : %d\n", re_right);
    printf("re_right - re_left = %d\n", re_right - re_left);

    return 0; 
}

执行结果

buff : [123,456]
re_left : 123
re_right : 456
re_right - re_left = 333

在测试代码中,打包了一个坐标字符串,通过函数解析获得整型得目标数据,可以直接进行运算。

  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 数据结构与算法分析是计算机科学中非常重要的基础课程。在这门课程中,我们学习和掌握了各种常见的数据结构和算法,并能够用C语言来描述和实现它们。 数据结构是计算机中用来组织和存储数据的方式。它们提供了一种抽象的方法,使得我们可以高效地对数据进行操作。常见的数据结构包括数组、链表、栈、队列、树和图等等。在C语言中,我们可以使用数组来实现线性结构,使用指针来构建链表和树等结构。 在算法分析中,我们研究了各种算法的性质和效率。算法是一种解决问题的方法和步骤。我们学习了如何分析算法的时间复杂度和空间复杂度,以及如何设计和改进算法,使其更加高效。常见的算法包括排序算法(如冒泡排序、快速排序)、查找算法(如二分查找)、图算法(如深度优先搜索、广度优先搜索)等等。在C语言中,我们可以使用循环、递归等控制结构来实现这些算法。 在数据结构与算法分析的课程中,我们通过理论学习和实践编程来掌握这些知识和技能。通过实践编程,我们可以更加深入地理解数据结构和算法的原理和实现细节。同时,我们也可以通过分析和优化算法,提高程序的效率和性能。 总之,数据结构与算法分析是计算机科学中非常重要的课程,掌握了这门课程,我们可以更好地理解和利用计算机中的数据和算法,从而设计和实现高效、可靠的计算机程序。通过C语言的描述和实现,我们可以更加深入地理解和应用这些概念和方法。 ### 回答2: 数据结构与算法是计算机科学中非常重要的两个概念。数据结构是指组织和存储数据的方式,算法则指解决问题的步骤和方法。 在C语言中描述数据结构和算法,可以通过定义结构体来表示各种数据结构。例如,可以使用结构体来表示链表、队列、栈等数据结构。结构体可以包含各种成员变量,用于存储数据元素以及指向其他数据指针。 对于算法的描述,可以使用函数来实现。使用函数可以将算法的实现过程封装起来,方便调用和复用。例如,可以使用函数来实现排序、搜索、图算法等。 C语言提供了丰富的语法和库函数,可以方便地描述和实现各种数据结构和算法。同时,C语言又是一门底层语言,对计算机底层的操作和内存管理有更好的掌控能力,可以高效地实现复杂的数据结构和算法。 在数据结构与算法的分析中,需要考虑时间复杂度和空间复杂度。时间复杂度描述了算法执行时间随输入规模增长的变化趋势,空间复杂度描述了算法所需内存空间随输入规模增长的变化趋势。在使用C语言描述的过程中,需要注意算法的性能分析和优化,使得算法在时间和空间上都能尽可能地高效。 总之,使用C语言描述数据结构与算法是一项重要的任务,需要综合运用C语言的语法和库函数,对数据结构的设计和算法的实现进行分析和优化,以达到高效、可靠的目标。 ### 回答3: 数据结构与算法分析是计算机科学中两个重要的概念。数据结构是指组织和存储数据的方式,而算法是解决问题的步骤和方法。C语言是一种高级编程语言,常用于实现数据结构和算法的描述。 在数据结构方面,C语言提供了一些基本的数据类型,如整数、浮点数和字符等。此外,C语言还支持数组、链表、栈、队列、树和图等复杂的数据结构。通过C语言的描述,可以定义并操作这些数据结构,方便地进行数据处理和存储。 在算法分析方面,C语言提供了丰富的控制结构和函数库,可以用于编各种算法。通过C语言的描述,我们可以实现常见的算法,例如排序、查找、递归和动态规划等。C语言的特性使得算法实现更加高效和可读,有助于提高程序的性能和可维护性。 数据结构和算法在计算机科学中具有广泛的应用。通过使用C语言描述数据结构和算法,我们可以更好地理解它们的原理和实现方式。同时,C语言描述也方便了我们在实际项目中应用和优化数据结构和算法。因此,熟练掌握数据结构与算法分析的C语言描述是每个计算机科学学习者和软件工程师的重要能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值