嵌入式软件开发中的数据类型转换
在嵌入式软件开发时,数据的显示必不可少,那么必定会涉及到数据类型转换。将不同类型的数据在编程中进行转换,以便满足不同的需求。
插入一个知识点: 在C语言中,字符串是由字符组成的字符数组,以null终止符(‘\0’)标识字符串的结束。每个字符都是一个字节,按顺序存储在内存中。
例如,字符串 “Hello” 在内存中的存储方式如下:
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| ‘H’ | ‘e’ | ‘l’ | ‘l’ | ‘o’ | ‘\0’ |
-
这里的 ‘\0’ 是null终止符,它表示字符串的结束。C语言中的字符串函数会根据这个null终止符来判断字符串的结束位置。
-
要在C语言中声明和操作字符串,可以使用字符数组来存储字符序列,并在数组的末尾添加一个null终止符,从而将其视为一个字符串。
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include <stdio.h>typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;uint main() {u8 u8Str[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 字符数组表示字符串printf("String: %s\n", str); // 打印字符串return 0;
}
- 通常情况下,我们使用字符串常量的简写方式来声明字符串:
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {u8 u8Str[] = "Hello"; // 字符串常量会自动添加null终止符printf("String: %s\n", u8Str);return 0;
}
一、单个字符 <----> 字符串
1.1 单个字符 转换为 字符串
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "string.h"
typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {// 单个字符转为字符串u8 u8Ch = 'A';u8 u8Ch2CharArr[2];u8Ch2CharArr[0] = u8Ch;u8Ch2CharArr[1] = '\0'; // 字符串末尾需要添加 null 终止符printf("Char2String: %s\n", u8Ch2CharArr);return 0;
}
1.2 字符串 转换为 单个字符
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "string.h"
typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {// 字符串转为单个字符u8 u8Str[] = "Hello";u8 u8Ch = u8Str[0];printf("Char from string: %c\n", u8Ch);return 0;
}
二、整数 <----> 字符串
2.1 整数 转为 字符串
- 版本一 :sprintf 函数
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "string.h"
#include "stdlib.h"typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {// 整数转为字符串u8 u8Num = 42;u8 u8StrFromInt[20]; // 适当大小的字符数组sprintf(u8StrFromInt, "%d", num);printf("String from int: %s\n", str_from_int);return 0;
}
注意:sprintf函数是一个变参函数,前两个函数有固定类型,会进行安全检查,后面的参数都不是类型安全的。使用的时要小心。还有一点就是sprintf() 的写操作可能会越过buffer的边界,从而产生一个缓冲区溢出。
- 版本二
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "string.h"
#include "stdlib.h"typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {u8 u8Num = 42;u8 u8StrFromInt[20]; // 适当大小的字符数组snprintf(u8StrFromInt, sizeof(u8StrFromInt), "%d", u8Num); // 使用sizeof来确保不会溢出printf("String from int: %s\n", u8StrFromInt);return 0;
}
用到的函数:snprintf函数和sprintf函数的区别
sprintf函数无法检查目的缓冲区是否溢出,相反,snprintf函数要求第二个参数指定目的缓冲区的大小,因此可以确保该缓冲区不溢出。
2.2 字符串 转为 整数
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "string.h"
#include "stdlib.h"typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {// 字符串 转为 整数u8 u8NumStr[] = "123";u32 u32IntFromStr = atoi(u8NumStr);printf("u32IntFromStr = %d\n", u32IntFromStr);return 0;
}
- atoi函数原型:int atoi(const char *str)
#include<iostream>
using namespace std;
int atio1(char *s)
{
int sign=1,num=0;if(*s=='-')sign=-1;s++;while((*s)!='\0'){num=num*10+(*s-'0');s++;} return num*sign;
}
三、浮点数 <----> 字符串
3.1 浮点数 转换为 字符串
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "stdlib.h"
#include "string.h"typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {// 浮点数转为字符串float f = 3.14159;u8 u8StrFromFloat[20]; // 适当大小的字符数组snprintf(u8StrFromFloat, sizeof(u8StrFromFloat), "%.2f", f); // 控制小数点位数printf("u8StrFromFloat = %s\n", u8StrFromFloat);return 0;
}
3.2 字符串 转换为 浮点数
/*
******************************************************************************
,* Function Name:
,* Author: By yangbocsu
,* Created: 2023.08.20
,* Description:
,* Parameters:Non
,* Returns: 0.
******************************************************************************
*/#include "stdio.h"
#include "stdlib.h"
#include "string.h"typedef unsigned char u8;
typedef signed char s8;typedef unsigned short u16;
typedef signed short s16;typedef unsigned int u32;
typedef signed int s32;int main() {// 字符串转为浮点数u8 u8FloatStr[] = "2.71828";float FloatFromStr = strtof(u8FloatStr, NULL);printf("FloatFromStr = %.5f\n", FloatFromStr);return 0;
}相关文章:
嵌入式软件开发中的数据类型转换
在嵌入式软件开发时,数据的显示必不可少,那么必定会涉及到数据类型转换。将不同类型的数据在编程中进行转换,以便满足不同的需求。 插入一个知识点: 在C语言中,字符串是由字符组成的字符数组,以null终止符…...
The Go Blog 01:反射的法则(译文)
反思的法则 罗伯-派克 2011 年 9 月 6 日 引言 计算机中的反射是指程序检查自身结构的能力,尤其是通过类型检查自身结构的能力;它是元编程的一种形式。它也是造成混乱的一个重要原因。 在本文中,我们试图通过解释 Go 中的反射是如何工作的…...
Visual Studio Code前端开发插件推荐
引言 Visual Studio Code(简称VS Code)是一款轻量级且强大的开源代码编辑器,广受前端开发者的喜爱。其丰富的插件生态系统为前端开发提供了许多便利和增强功能的插件。本篇博客将向大家推荐一些在前端开发中常用且优秀的插件,并提…...
jps(JVM Process Status Tool):虚拟机进程状况工具
jps(JVM Process Status Tool):虚拟机进程状况工具 列出正在运行的虚拟机进程,并显示虚拟机执行主类名称(Main Class,main()函数所在的类)以及这些进程的本地虚拟机唯一ID(LVMID&am…...
初阶c语言:实战项目三子棋
前言 大家已经和博主学习有一段时间了,今天讲一个有趣的实战项目——三子棋 目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 时间戳:推荐一篇 C语言生成随机数的方法_c语言随机数_杯浅…...
计网第三章(数据链路层)(三)
一、点对点协议PPP 在第一篇里有提到数据链路层的信道分为两种:点对点信道和广播信道。 PPP协议就属于点对点信道上的协议。 如果对前面数据链路层的三个基本问题了解的比较透彻,那么这一块很多东西都很好理解。 从考试的角度来讲,PPP协议…...
蓝桥杯每日N题 (砝码称重)
大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 不清楚蓝桥杯考什么的点点下方👇 考点秘籍 想背纯享模版的伙伴们点点下方👇 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…...
Opencv 视频的读取与写入
目录 前言 通过路径获取视频内容 获取视频内容 检查是否正确打开 循环播放 完整代码 从摄像头读取视频数据 获取视频设备 其他与直接读取视频一致 完整实例 录制视频 用于创建视频编解码器的四字符码(FourCC) cv2.VideoWriter() 将视频帧…...
LeetCode 833. Find And Replace in String【字符串,哈希表,模拟】1460
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
Cesium轨迹漫游及视角切换
飞行漫游,就是让Camera飞行。Camera有一些方法可以实现位置、视角的调整,比如flyTo,setView方法。但这些方法并不能沿着我们想要的路径调整,在通过插值的方法不停的调用setView,但这样会造成视图卡顿,而且计…...
构建去中心化微服务集群,满足高可用性和高并发需求的实践指南!
随着互联网技术的不断发展,微服务架构已经成为了开发和部署应用程序的一种主流方式。然而,当应用程序需要满足高可用性和高并发需求时,单一中心化的微服务架构可能无法满足性能和可靠性的要求。因此,构建一个去中心化的微服务集群…...
开集输出和开漏输出
首先指明一下以下8中GPIO输入输出模式: GPIO_Mode_AIN 模拟输入; GPIO_Mode_IN_FLOATING 浮空输入; GPIO_Mode_IPD 下拉输入; GPIO_Mode…...
解决内网GitLab 社区版 15.11.13项目拉取失败
问题描述 GitLab 社区版 发布不久,搭建在内网拉取项目报错,可能提示 unable to access https://github.comxxxxxxxxxxx: Failed to connect to xxxxxxxxxxxxxGit clone error - Invalid argument error:14077438:SSL routines:SSL23_GET_S 15.11.13ht…...
【MySQL--->表的约束】
文章目录 [TOC](文章目录) 一、表的约束概念二、空属性约束三、default约束四、zerofill约束五、主键约束六、auto_increment(自增长)约束七、唯一键约束八、外键约束 一、表的约束概念 表通过约束可以保证插入数据的合法性,本质是通过技术手段,保证插入数据收约束,保证数据的…...
github中Keyless Google Maps API在网页中显示地图和标记 无需api key
使用Google Maps API在网页中显示地图和标记的示例博客。以下是一个简单的示例: C:\pythoncode\blog\google-map-markers-gh-pages\google-map-markers-gh-pages\index.html 介绍: 在本篇博客中,我们将学习如何使用Google Maps API在网页中…...
ComPDFKit PDF SDK for Windows Crack
ComPDFKit PDF SDK for Windows Crack 添加了在创建文本框时调整默认属性的支持。 增加了对调整PDF大小时调整宽度的支持。 添加了对编辑文本时更多快捷方式的支持。 优化了文本输入,并将字体样式与原始文本相匹配。 在内容编辑器模式下复制和粘贴时优化了UI交互。 …...
React+Typescript 状态管理
好 本文 我们来说说状态管理 也就是我们的 state 我们直接顺便写一个组件 参考代码如下 import * as React from "react";interface IProps {title: string,age: number }interface IState {count:number }export default class hello extends React.Component<I…...
stable diffusion 运行时报错: returned non-zero exit status 1.
运行sh run.sh安装stable diffusion时报错:ImportError: cannot import name builder from google.protobuf.internal (stable-diffusion-webui/venv/lib/python3.8/site-packages/google/protobuf/internal/__init__.py) 原因:python版本过低࿰…...
el-popover弹窗修改三角样式或者位置
el-popover中设置类名 popper-class"filepopver",我这位置是placement"top-start" <el-popover placement"top-start" popper-class"filepopver" class"filename" width"300" trigger"hover&q…...
Linux驱动开发之点亮三盏小灯
头文件 #ifndef __HEAD_H__ #define __HEAD_H__//LED1和LED3的硬件地址 #define PHY_LED1_MODER 0x50006000 #define PHY_LED1_ODR 0x50006014 #define PHY_LED1_RCC 0x50000A28 //LED2的硬件地址 #define PHY_LED2_MODER 0x50007000 #define PHY_LED2_ODR 0x50007014 #define…...
Mermaid在线编辑器完整指南:3步制作专业图表零基础入门
Mermaid在线编辑器完整指南:3步制作专业图表零基础入门 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edito…...
保姆级教程:用串口和Telnet连接Hi3559/Hi3516开发板,5分钟搞定环境搭建
5分钟极速上手:Hi3559/Hi3516开发板串口与Telnet连接实战指南 刚拿到海思开发板时,许多开发者会被一堆陌生的接口和术语吓退。其实只要掌握几个关键步骤,从拆箱到建立稳定连接只需一根串口线和五分钟时间。本文将用最直白的语言,带…...
GitHub访问加速终极指南:5分钟告别龟速访问的完整解决方案
GitHub访问加速终极指南:5分钟告别龟速访问的完整解决方案 【免费下载链接】fetch-github-hosts 🌏 同步github的hosts工具,支持多平台的图形化和命令行,内置客户端和服务端两种模式~ | Synchronize GitHub hosts tool, support m…...
MySQL视图实战:用SQL视图搞定学生奖学金评定与补考名单(附完整代码)
MySQL视图实战:用SQL视图搞定学生奖学金评定与补考名单(附完整代码) 教务管理系统中,数据处理效率直接影响决策质量。想象一下每学期末,教务处老师需要从数十万条记录中筛选奖学金候选人和补考名单——传统的手写SQL查…...
SDMatte抠图实战教程:玻璃/薄纱/羽毛一键去背景,保姆级Web部署指南
SDMatte抠图实战教程:玻璃/薄纱/羽毛一键去背景,保姆级Web部署指南 1. 为什么选择SDMatte进行专业抠图 在日常设计工作中,抠图是最基础也最耗时的环节之一。特别是遇到玻璃制品、薄纱材质、羽毛边缘这类复杂对象时,传统Photosho…...
3MF格式与Blender从入门到精通:重塑3D打印工作流
3MF格式与Blender从入门到精通:重塑3D打印工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 概念解析:为什么3MF正在取代STL成为行业新标准 …...
PowerBuilder老系统维护指南:PB12.5连接现代数据库(如MySQL 8.0)的避坑实操
PowerBuilder老系统维护实战:PB12.5连接MySQL 8.0的七个关键步骤 当技术栈的代际差异超过十年,每一次数据库连接尝试都可能演变成一场跨越时空的调试马拉松。那些在2006年运行良好的PB12.5应用,今天面对MySQL 8.0的SSL加密要求和UTF8MB4字符集…...
20吨燃气蒸汽锅炉实力厂家/支持上门安装调试
燃气蒸汽锅炉,认准源头实力厂家,不仅能买到品质过硬的设备,更能享受到省心便捷的上门安装调试服务,免去自行安装的繁琐与隐患,让设备快速投入平稳运行。我们作为深耕锅炉制造行业的实力厂家,具备正规生产资…...
视频文件修复全攻略:如何用Untrunc工具抢救损坏的MP4/MOV文件
视频文件修复全攻略:如何用Untrunc工具抢救损坏的MP4/MOV文件 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 当你打开存储着家庭聚会回忆的视频文件时&…...
Keepalived+Nginx+Tomcat 高可用项目集成 MySQL 数据库全记录
前言在之前的文章中,我搭建了基于 KeepalivedNginxTomcat 的高可用 Web 架构,实现了入口 VIP 漂移和反向代理。但这套架构还缺少“数据层”——所有服务都是无状态的,不能持久化数据。为了让项目更完整,我决定加入 MySQL 数据库&a…...
