嵌入式软件开发中的数据类型转换
在嵌入式软件开发时,数据的显示必不可少,那么必定会涉及到数据类型转换。将不同类型的数据在编程中进行转换,以便满足不同的需求。
插入一个知识点: 在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…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
PLC入门【4】基本指令2(SET RST)
04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C),从 文件 - 主画面,“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...
