振南技术干货集:C语言的一些“骚操作”及其深层理解(3)

注解目录

第二章《c语言的一些“操作”及其深层理解》

一、字符串的实质就是指针

(如何将 35 转为对应的十六进制字符串”0X23”?)

二 、转义符\

(打入字符串内部的“奸细”。)

三、字符串常量的连接

(字符串常量是双面胶,你知道吗?)

四、长字符串的拆分技巧

(GPS 数据帧 NMEA、Shell 命令行和 AT 指令的解析,是长串拆分的典型应用。)

五、巧取数值的各位数码

(玩多位数码管的必有操作。)

六、printf 的实质与使用技巧

(自认为很了解 printf?那你试过向 3 个 UART 打印吗?或者打印到液晶屏上?)

七、关于浮点数的传输

(浮点只是一种假象,看清它的本质。)

八、关于数据的直接操作

(如何快速计算浮点的相反数,乘以-1.0?再想想。)

九、 浮点的四舍五入与比较

(老师说浮点不能直接判等,为什么?)

十、的 出神入化的 for 循环

(for 循环很熟悉了吧?OK,振南出了几道题,来试试。)

十一、 隐藏的死循环

(我们在明处,有时死循环在暗处。)

十二、 看似多余的空循环

(没用的东西?)

十三、 独立执行体

(这个概念 C 语言里没学过?那就对了,我经常用。)

十四、 多用() 无坏处

(万物皆可加括号。)

十五、== 的反向测试

(把==错写成=,能让你调程序调到吐血。)

十六、 赋值操作的实质

(让数学教授困惑半生的 C 语言赋值操作。)

十七、 关于补码

(摊牌了,CPU 其实不会作减法。)

十八、 关于-1

(-1 就是全 F,全 F 就是-1。)

二十、字节快速位逆序

(时间与空间的相互转化--计算机中的相对论)

二十一、关于 volatile

(有些东西不可优化。)

二十二、关于变量互换

(位操作的奇妙。)

二十三、关于 sizeof

(告诉你关于 sizeof 那些少人关注的问题。)

二十四、memcpy 的效率

(小小的函数也有大大的背景)

二十五、[] 的本质

(你以为[]只是数组下标?)

二十六、# 与##( 串化与连接)

(一个不曾出现在 C 语言教材中的知识点)

1

字符串的实质就是指针

长字符串的拆分技巧


很多时候我们需要进行长字符串的拆分。在振南的研发经历中,使用到这种操作的最典型的应用场合有三个。

1.NMEA 协议数据的解析

NMEA 可能很多人不太了解,但是说到GPS肯定大家都很熟悉。当我们从GPS 模块中读取定位信息的时候,数据就是遵循NMEA协议格式的。图 2.2 为一个标准的GPS数据帧。


图 2.2 一个符合 NMEA 协议标准的 GPS 数据帧

整个数据帧采用ASCII编码,它以 $GP作为开始,后面依次排列的是各项参数,参数之间使用,作为分隔。比如 $GPRMC为推荐定位信息,我当时就是使用这一条数据来获取经纬度信息的(当时是 Intel 杯嵌入式邀请赛需要作一个手持 GPS 跟踪器)。这条数据中N后面是纬度,E后面是经度。我们要作的就是将它们从整个数据帧(一个长字符串)中提取出来。所以,这就涉及到了所谓的“长串拆分”。

2.Shell 命令行的命令解析

在很多项目中,我都习惯于基于串口编写一个后台 Shell 系统,可以起到一个基本的调试作用。从而一定程度上减少修改代码和固件烧录的次数。比如,项目中如果涉及DAC电压经常的调整输出,我就会在后台中设计一个命令SetVn,以便随时灵活的操控DAC。随着项目功能的升级,后台命令也会变得开始复杂。比如 SetArg a b c d e f g h.... ,用于同时设置程序中多个关键参数的值;再比如 SetV channel n freq a,设置某通道第n个信号的输出幅值和频率。

这些命令通过PC上的串口助手或调试终端来发送,比如超级终端、 SecureCRT 或 XShell等。程序中从串口接收到命令之后,将其放入内存的缓冲区中,其形式就是一个字符串。命令字以及后面的若干参数之间使用空格来分隔。程序要匹配命令字,并提取参数,以便执行相应的操作。所以,这也涉及长串的拆分。

3.DTU 模块的 AT 指令解析

AT指令其实和NMEA 是一个道理,它们都是一种通信协议格式,只不过AT指令更多使用在网络通信模块中,比如SIM800 、 ESP8266 、 HC06 蓝牙串口等。举个例子,我们想知道网络信号强度,就可以向模块发送” AT+CSQ\r\n ”,模块会返回” +CSQ:29 , 0\r\n ”。CSQ:后面的 29 就是信号强度。它们都是ASCII编码的,也就是一个字符串。我们需要将 29 从其中提取出来。当然,AT 指令也有比较复杂的,字符串会比较长,包含的参数也会比较多。所以,要想使用这些网络模块实现网络通信,就必须实现对 AT 指令的解析。

说了这么多,都是在说长串拆分很重要。根本问题是如何实现它?很多人可能都会想到使用那个分隔字符,比如空格、逗号。然后去一个个数要提取的参数前面有几个分隔字符,然后后将相应位置上的字符组成一个新的短字符串,如图 2.3 所示


图 2.3 通过分隔字符定位要提取的部分

这种方法固然可行,但是略显笨拙。其实对于这种有明显分隔符的长字符串,我们可以采用“打散”或“爆炸”的思想,具体过程是这样的:将长字符串中的所有分隔符全部替换为’\0 ’,即字符串结束符。此时,长字符串就被分解成了在内存中顺序存放的若干个短字符串。如果要取出第 n 个短字符串,可以用这个函数:

char*substr ( char*str , n )

{

unsigned charlen=strlen ( str );

for (; len ﹥ 0 ; len-- ){if ( str [ len-1 ] ==ˈˈ )str [ len-1 ] =0 ;}

for (; n ﹥ 0 ; n-- )

{

str+= ( strlen ( str ) +1 );

}

returnstr ;

}

很多时候我们需要一次性访问长字符串中的多个短字符串,此时振南经常会这样来作:通过一个循环,将长字符串中的所有分隔符替换为’\0 ’,在此过程中将每一个短字符串首字符的位置记录到一个数组中,代码如下:


好,举个例子:我们要提取”abc 1000 50 off 2500 ”中的” abc ”、” 50 ”和” off ”,可以使用上面的函数来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126791.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文了解Nginx及其基本配置

一、关于Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。 Nginx可以用于处理静态资源、负载均衡、反向代理和缓存等任务。 Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。 Nginx具有低内存消耗、高并发能力和良好的稳定性,因此在互联网领域非常受…

泛微E-Mobile 6.0命令执行漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、漏洞原理 泛微E-Mobile 6.0存在命令执行漏洞的问题,在…

202205(第13届)蓝桥杯Scratch图形化编程青少组(国赛_中级)真题

202205(第13届)蓝桥杯Scratch图形化编程青少组(国赛_中级)真题 第 1 题 以下程序,小猫在移动完成后不能回到初始位置的是?( ) A: B: C: D: 第 2 题 以下程序,询问…

基于SSM的社区生鲜电商平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

LoadRunner脚本编写之二

下面来回顾一下嵌套循环例子。 Action() {int i,j; //生命两个变量for (i1;i<5;i) //第一重循环&#xff0c;循环5次{if (i3) break; //当i等于3时&#xff0c;跳出本重循环elselr_output_message("i%d",i); //否则&#xff0c;输入i的值for (j1;j<…

VNC连接服务器实现远程桌面 --以AutoDL云服务器为例

VNC连接服务器实现远程桌面 --以AutoDL云服务器为例 针对本地机为Windows 云服务器租显卡跑些小模型很方便&#xff0c;但是当你想做可视化的时候&#xff0c;可能会遇到麻烦&#xff0c;云服务器没有显示输出界面&#xff0c;无法可视化一些检测任务的结果&#xff0c;或者可…

支持在代码编辑器中调试接口,IDEA插件推荐

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

Java进阶(JVM调优)——阿里云的Arthas的使用 安装和使用 死锁查找案例,重新加载案例,慢调用分析

前言 JVM作为Java进阶的知识&#xff0c;是需要Java程序员不断深度和理解的。 本篇博客介绍JVM调优的工具阿里云的Arthas的使用&#xff0c;安装和使用&#xff0c;命令的使用案例&#xff1b;死锁查询的案例&#xff1b;重新加载一个类信息的案例&#xff1b;调用慢的分析案…

银河麒麟等 Linux系统 安装 .net 3.1,net 6及更高版本的方法

确定 系统的版本。华为鲲鹏处理器是 Arm64位的。 于是到windows 官网下载对应版本 .net sdk 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet 2.下载完成后&#xff0c;再linux 服务器 上进入到文件所在目录&#xff0c;建议全英文路径。 然后依次输入以下命令 …

使用切面实现前端重复提交(防抖)

使用切面实现前端重复提交&#xff08;防抖&#xff09; 代码结构定义注解请求锁切面处理器入参对象使用注解 代码结构 原理&#xff1a; 1、前端提交保存操作&#xff1b; 2、后端通过注解指定重复提交的关键字段进行识别&#xff0c;可以有多个&#xff1b; 3、拼接关键字段&…

C#医学检验室(LIS)信息管理系统源码

LIS:实验室信息管理系统 (Laboratory Information Management System简称:LIS)。 LIS 是面向医院检验科、检验中心、动物实验所、生物医疗研究所等科研单位研发的集数据采集、传输、存储、分析、处理、发布等功能于一体的信息管理系统。 一、完善的质控&#xff1a; 从样本管理…

python实现微信新版v3的jsapi支付

python实现微信新版v3的jsapi支付 1、需要从公众号、商户号获取的信息 注意&#xff1a;在商户号的支付授权目录中需要设置好发起支付的界面url&#xff0c;比如我的&#xff1a; http://xxx/paypage/# 商户证书私钥&#xff0c;此文件不要放置在下面设置的CERT_DIR目录里。…

excel中超级表和普通表的相互转换

1、普通表转换为超级表 选中表内任一单元格&#xff0c;然后按CtrlT&#xff0c;确认即可。 2、超级表转换为普通表 选中超级表内任一单元格&#xff0c;右键&#xff0c;表格&#xff0c;转换为区域&#xff0c;确定即可。 这时虽然已经变成了普通表&#xff0c;但样式没有…

【机器学习】七、降维与度量学习

1. 维数灾难 样本的特征数称为维数&#xff08;dimensionality&#xff09;&#xff0c;当维数非常大时&#xff0c;也就是现在所说的维数灾难。 维数灾难具体表现在&#xff1a;在高维情形下&#xff0c;数据样本将变得十分稀疏&#xff0c;因为此时要满足训练样本为“密采样…

如何设计开发一对一交友App吸引更多活跃用户

在当今社交媒体时代&#xff0c;一对一交友App开发正日渐成为发展热点。如何吸引更多活跃用户成为开发者们的首要任务。通过本文&#xff0c;我们将探讨一系列方法&#xff0c;助您设计开发一对一交友App&#xff0c;吸引更多用户的关注和参与&#xff0c;提升App的活跃度。 了…

《012.SpringBoot+vue之在线考试系统》【前后端分离有开发文档】

《012.SpringBootvue之在线考试系统》【前后端分离&有开发文档】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;idea jdk1.8 maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisMySQL; 前台&#xff1a;Vue; [2]功能模块展示&…

2024上海智博会,上海国际智慧城市,物联网,大数据展会(世亚智博会)

中国国际智慧城市,物联网,大数据博览会&#xff08;简称:世亚智博会&#xff09;自2010年创办以来&#xff0c;至今已成功举办十多届。世亚智博会是中国较高、规模较大、影响力较广的展会&#xff1b;是被国际业界公认的不可错过的名展之一。随着世亚智博会的国际地位和影响不断…

NFT数字藏品(交易平台)系统开发

随着数字技术和区块链技术的发展&#xff0c;NFT数字藏品交易平台系统开发逐渐成为了一个热门话题。NFT&#xff0c;即非同质化代币&#xff0c;可以用来代表独一无二的数字资产&#xff0c;如图片、音频、视频等&#xff0c;在数字世界中具有极高的价值。本文将介绍NFT数字藏品…

拆分代码 + 动态加载 + 预加载,减少首屏资源,提升首屏性能及应用体验

github 原文地址 我们看一些针对《如何提升应用首屏加载体验》的文章&#xff0c;提到的必不可少的措施&#xff0c;便是减少首屏幕加载资源的大小&#xff0c;而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件与 react 组件实现的一套研发高度自定…

AI 时代的企业级安全合规策略

目录 漏洞分类管理的流程 安全策略管理 在扫描结果策略中定义细粒度的规则 有效考虑整个组织中的关键漏洞 确保职责分离 尝试组合拳 本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Grant Hickman 在应用程序敏捷研发、敏捷交付的今天&#xff0c;让安全人员跟上…