• 一 数字类型与字符串类型

在做嵌入式C程序开发中,如果通信协议采用字符串方式来交互数据,比如使用到AT指令格式,或者需要GUI界面的显示,那么就会经常用到数字类型与字符串类型的转换。在C语言标准库stdlib中提供了多个字符串与数字类型的转换函数,丰富的转换功能能够满足绝大多数的需求,方便了C语言的开发。

1.1、数字类型

多个数据在内存中是连续存储的,彼此之间没有明显的界限,如果不明确指明数据的长度,计算机就不知道何时存取结束。因此,C语言的数据类型就是明确指明了当前数据的长度信息。

C语言自带的基本数字数据类型有char(字符型)、short(短整型)、int(整型)、long(长整型)、long long(长整型)、float(单精度浮点型)、double(双精度浮点型)、void *(指针型)。每个数据类型的所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。

对于指定编译器,每种数据类型的长度是固定的,因此根据数据类型定义了数据后,其在内存中的存取位置大小也是固定,如图所示,定义了char/short/int/longlong类型的数据,其在内存中的分配情况,数据按小端存储。

目前采用MDK的内置ARMCC5.0编译器中,各种数据类型的长度如上图的32位栏中所示,与ARMCC5.0编译后在MCU执行所获取的类型长度一致。

输出的类型长度信息如下图所示:

1.2、字符串

基于STM32芯片的C编程,字符串的表现形式可以是常量字符串或保存于数组中,如下图所示:

数字字符串就是将C语言的基本数字类型,转换为C语言的字符串形式,C语言的标准库stdlib中提供了许多的转换函数。

其中itoa()、ltoa()、ultoa()函数不是标准的ANSI,一般只在Windows平台下的C编译器支持,Linux平台下的GCC编译器不一定支持这3个函数。因此如果需要进行跨平台开发,数字类型转为字符串类型,应采用标准ANSI C支持的sprintf()函数。

  • 二 数字转字符串

2.1、itoa()、ltoa()、ultoa()函数

函数原型

char *itoa(int value,char *string,int radix)

将整数value转换成字串存入string,radix为转换所用基数.

char *ltoa(long value,char *string,int radix)

将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char *ultoa(unsigned long value,char *string,int radix)

将无符号长整型数value转换成字符串并返回该字符串,radix为转换时所用基数

参数说明

value:欲转换的数据。

string:目标字符串的地址。

radix:转换后的进制数,可以是2进制、8进制、10进制、16进制等。

使用示例

其中转换完成后,会在aStr内存中保存转换的值加上结尾的空字符(‘\0’)。

itoa()、ltoa()、ultoa()函数这3个函数在ARMCC编译器下是不支持的,链接时找不到函数定义。因此STM32芯片进行C编程需要使用sprintf()函数。

2.2、fcvt()函数

函数原型

char *fcvt(double value, int ndigit, int *decpt, int *sign);

将value所代表的小数,转换为字符串返回。

参数说明

value:要转换的浮点数(输入参数)

ndigit:小数的位数(输入参数)

decpt:表示小数点的位置(输出参数)

sign:表示value的符号,0为正数,1为负数(输出参数)

返回:转换后的字符串内容

使用示例

fcvt()函数这个函数在ARMCC编译器下是不支持的,链接时在stdlib.h头文件中找不到函数定义。

因此STM32芯片进行C编程需要使用sprintf()函数。但是在pc下通过wingcc编译没有问题,输出结果如下所示:

fcvt()转换的结果是将一个小数的值、符号位、小数点区分开来表示,而不是直接字符串显示整个小数值(如“-123.45000”),

2.3、gcvt()函数

函数原型

char *gcvt(double value, int ndigit, char *buf)

将value所代表的小数,转换为字符串保存于buf中。

参数说明

value:要转换的浮点数(输入参数)

ndigit:小数的有效位数(输入参数)

buf:保存字符串的缓冲地址(输出参数)

使用示例

同样的,gcvt()函数这个函数在ARMCC编译器下是不支持的,链接时在stdlib.h头文件中找不到函数定义。

但是在pc下通过wingcc编译没有问题,输出结果如下所示:

2.4、sprintf()函数

以上几个转换函数在armcc下均不支持,因此需要用到sprintf()函数将数字转换为字符串,sprintf()函数在c标准内是支持的,armcc也支持。

函数原型

int sprintf(char *str, const char *format, ...)

发送格式化输出到 str 所指向的字符串。

参数说明

str :这是指向一个字符数组的指针,该数组存储了 C 字符串

format :这是字符串,包含了要被写入到字符串 str 的文本。Format参数的格式 %[flags][width][.precision][length]specifier,具体讲解如下:

使用示例一,整数转字符串:

其中转换完成后,会在aStr内存中保存转换的值加上结尾的空字符(‘\0’)。

分别将idata转换为8进制、10进制、16进制的字符串,并打印输出:

使用示例二,小数转字符串:

通过指定小数点后面的位数来输出不同的小数精度,科学计数法比较容易损失数据精度,以上转换的输出结果为:

  • 三 字符串转数字

3.1、atoi()、atol()、atof()函数

函数原型

int atoi (const char * str);

解析字符串str,将其内容解释为整数,返回int类型的值。

long int atol ( const char * str );

解析字符串str,将其内容解释为长整数,返回long类型的值。

double atof (const char* str);

解析字符串str,将其内容解释为浮点型,返回double类型的值。

参数说明

str:包含数字的字符串。

函数首先丢弃str中所有必要的空格字符,直到找到一个非空格字符,然后从这个字符开始,先查找符号位(+/-),后面再找尽可能多的以10为基数的数字,直到遇到非数字字符结束,然后开始转换。

使用示例

atoi()、atol()、atof()函数在armcc下是支持的,因此编译没问题,执行后输出如下结果:

3.2、strtof()、strtol()函数

这两个函数可以连续转换字符串里面的多个数字子串,如:str=”1.23 33.456”里面有两个子串”1.23”与”33.456”,因此可以连续调用strtof()函数获取该值。

函数原型:

float strtof (const char* str, char** endptr)

函数首先丢弃str中所有必要的空格字符,直到找到一个非空格字符,然后从这个字符开始,先查找符号位(+/-),后面再找尽可能多的以10为基数的数字,直到遇到空格字符结束,然后开始转换。如果endptr不是空指针,该函数还将endptr的值设置为指向上次转换的数字后面的第一个字符。

long int strtol (const char* str, char** endptr, int base);

函数首先丢弃str中所有必要的空格字符,直到找到一个非空格字符,然后从这个字符开始,先查找符号位(+/-),后面再找尽可能多的以base为基数的数字,直到遇到空格字符结束,然后开始转换。如果endptr不是空指针,该函数还将endptr的值设置为指向上次转换的数字后面的第一个字符。

使用示例一,strtol()函数

输出结果为(10进制打印):

注:如果str或endptr首字符非法,如“mk2001 60c0c0”以mk非法字符开头,转换的结果为0。

使用示例二,strtof()函数

输出结果为:

注:如果str或endptr首字符非法,如"K686.97 365.24 1.2345",以K非法字符开头,转换的结果为0.0,如下输出结果:

编写STM32 C程序:字符串String转数字, 数字转字符串String相关推荐

  1. C++primer第五版 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分

    这是一个关于字符串处理的简单程序,但是里面有一些细节是值得关注的.先附上程序: // primer_3_2_3.cpp : Defines the entry point for the applic ...

  2. 如何用c语言编写stm32的程序吗,STM32入门C语言详解

    <STM32入门C语言详解>由会员分享,可在线阅读,更多相关<STM32入门C语言详解(6页珍藏版)>请在人人文库网上搜索. 1.最新 料推荐阅读 flash : 芯片内部存储 ...

  3. 请编写程序,由键盘录入一个字符串,统计字符串中英文字母和数字分别有多少个。 比如:Hello12345World中字母:10个,数字:5个。

    package HomeWorks.Day.Day22;import java.nio.charset.StandardCharsets; import java.util.Scanner;publi ...

  4. 汇编语言: 从键盘上输入一串字符(用回车键结束,使用 10 号功能调用。)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字。如有,则把 CL 的第 5 位置 1,否则将该位置置 0。

    从键盘上输入一串字符(用回车键结束,使用 10 号功能调用.)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字.如有,则把 CL 的第 5 位置 1,否则将该位置置 0. data s ...

  5. 分别统计出其中英文字母、空格、数字和其它字符的个数 matlab 程序,编写一段程序,要求先输入一行字符,然后分别统计出其中英文...

    编写一个求和的程序,要求能任意输入两个整数,求和 用javascript写 +=functionadd(){varA=document.getElementById("a").va ...

  6. 1. 编写函数 cal_numbers:参数为字符串,统计并返回该字符串中的英文字母、空格、数字和其它字符的个数

    1. 编写函数 cal_numbers:,参数为字符串,统计并返回该字符串中的英文字母.空格.数字和其它字符的个数,程序框架: def cal_numbers(strVal):计算 strVal 中, ...

  7. Java黑皮书课后题第8章:**8.36(拉丁方阵)拉丁方阵是一个n*n的数组,其中有n个不同的拉丁字母,并且每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输入数字n和字符数组

    **8.36(拉丁方阵)拉丁方阵是一个n*n的数组,其中有n个不同的拉丁字母,并且每个拉丁字母恰好只在每行和每列中出现一次 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.36 ...

  8. Java黑皮书课后题第7章:*7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目

    7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目 题目 题目描述 破题 代码 运行实例 题目 题目描述 7.22(计算一个字符串中大写字母的数 ...

  9. Java黑皮书课后题第6章:6.37(格式化整数)编写一个测试程序,提示用户输入一个数字以及宽度,显示通过调用format方法返回的字符串

    6.37(格式化整数)编写一个测试程序,提示用户输入一个数字以及宽度,显示通过调用format方法返回的字符串 题目 题目描述 破题 代码 运行示例 题目 题目描述 6.37(格式化整数) 使用下面的 ...

最新文章

  1. 收藏:存储知识全面总结
  2. 消息队列MQ技术介绍
  3. mysql 创建删除表_mysql创建删除表的实例详解
  4. Redis常见面试题7 Pipeline及主从同步
  5. 巴铁 无人驾驶_巴铁?Clip-air?请查收汽车的最新玩法
  6. html5制作心路历程,一个真正0基础小白学习前端开发的心路历程
  7. SQL Where子句
  8. 用R语言绘制动态地图,代码奉上!(REmap包详解)
  9. Keil MDK浮点数支持不正常的解决方案
  10. font-style字体设置
  11. 中国法律年鉴Excel版本(1990-2021年)
  12. Revit二次开发——轴网
  13. 区块链技术在银行业的应用
  14. 数商云:传统建筑行业产业转型,轻松实现建筑材料信息系统撮合交易智能化、数字化管理
  15. hosts文件位置在哪里
  16. 记一次搜狐畅游后台开发笔试
  17. 最好用的mac免费PDF阅读器是什么?
  18. 无盘服务器 安装客户机程序,顺网云服务端和客户端安装
  19. 信创云领未来,华云数据打造科技强国新基座
  20. 怎样在微信中直接下载秒借类金融贷款APP,避免下载链接域名被微信屏蔽封杀的处理方式

热门文章

  1. 回忆录之初试三顾冒菜道
  2. Python 不用sort对列表排序
  3. rubik-cube-solver 使用js求解魔方
  4. Java5.0垃圾回收性能调优-1、简介,2、Ergonomics工效学[Vange译]
  5. JS动态模拟Form表单提交数据
  6. MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)
  7. excel设置行高_Excel如何制作课程表?
  8. 写爬虫遇到 AES 加密参数
  9. 没错,用三方 Github 做授权登录就是这么简单!(OAuth2.0实战)
  10. 10 八段-愿景:设计人生导航系统