C语言中的字符串转换函数-atof,atoi,atol,printf,tolower,toupper,toascii...等等

C语言字符串与数字转换:从atoi到strtol的嵌入式实战指南 在C语言编程中,字符串与数字的相互转换是数据处理的基础操作,涉及内存解析、类型表示等核心原理。这一技术对于构建健壮、可靠的软件系统至关重要,尤其在嵌入式开发、通信协议解析、数据格式化等场景中广泛应用。理解不同转换函数的内在机制与安全边界,能有效避免数据错误、内存溢出等隐患。本文聚焦于`strtol`、`atoi`等关键函数,通过对比其错误处理能力与适用场景,深入探讨如何在资源受限的MCU环境中实现安全高效的转换,并涵盖进制处理、浮点数解析等实战技巧,为嵌入式工程师提供一套完整的避坑指南与最佳实践。 阅读详情

在C语言中,通常有2种方法进行字符串与数字的转换,一种是用pirntf系列函数来转换,另一种是调用C语言提供的字符串转换函数。


1. 用pirntf系列函数来转换
(1) 字符串转成数字一例:

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

int main()
{
 char c[5] = "12.34";
 double d;
 sscanf(c,"%lf",&d);
 printf("%g",d);

 return 0;
}

运行结果:

12.34

(2) 数字转成字符串一例:

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

int main()
{
 char x[10]={0,};
 int y= 1542;
 
 sprintf(x,"%d", y);
 printf("x = %s", x);
 
 return 0;
}

运行结果:

x = 1542


2. C语言提供了丰富的字符串转换函数,列表如下:

atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)
atol(将字符串转换成长整型数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)


 (1)atof(将字符串转换成浮点型数)
相关函数 atoi,atol,strtod,strtol,strtoul
表头文件 #include <stdlib.h>
定义函数 double atof(const char *nptr);
函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数
     字或正负符号才开始做转换,而再遇到非数字或字符串结束时
     ('/0')才结束转换,并将结果返回。参数nptr字符串可包含正负
     号、小数点或E(e)来表示指数部分,如123.456或123e-2。
返回值 返回转换后的浮点型数。
附加说明 atof()与使用strtod(nptr,(char**)NULL)结果相同。
范例 /* 将字符串a 与字符串b转换成数字后相加*/

#include <stdlib.h>
#include <stdio.h>
 int main()
 {
     char *a="-100.23";
     char *b="200e-2";
     float c;
     c=atof(a)+atof(b);
     printf("c=%.2f\n",c);
     return 0;
 }

运行结果:

aibook@aibookdeMacBook-Pro c_stu % gcc a2f.c

aibook@aibookdeMacBook-Pro c_stu % ./a.out

c=-98.23


     (2)atoi(将字符串转换成整型数)
相关函数 atof,atol,atrtod,strtol,strtoul
表头文件 #include<stdlib.h>
定义函数 int atoi(const char *nptr);
函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数
     字或正负符号才开始做转换,而再遇到非数字或字符串结束时
     ('/0')才结束转换,并将结果返回。
返回值 返回转换后的整型数。
附加说明 atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。
范例 /* 将字符串a 与字符串b转换成数字后相加*/

#include <stdlib.h>
#include <stdio.h>
 int main()
 {
     char a[]="-100";
     char b[]="456";
     int c;
     c=atoi(a)+atoi(b);
     printf("c=%d\n",c);
     return 0;
 }
 

运行结果:

aibook@aibookdeMacBook-Pro c_stu % ./a.out

c=356


    (3) atol(将字符串转换成长整型数)
相关函数 atof,atoi,strtod,strtol,strtoul

表头文件 #include<stdlib.h>
定义函数 long atol(const char *nptr);
函数说明 atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数
     字或正负符号才开始做转换,而再遇到非数字或字符串结束时
     ('/0')才结束转换,并将结果返回。
返回值 返回转换后的长整型数。
附加说明 atol()与使用strtol(nptr,(char**)NULL,10);结果相同。
范例 /*将字符串a与字符串b转换成数字后相加*/

#include <stdio.h>
#include <stdlib.h>
int main()
{
     char a[]="1000000000";
     char b[]=" 234567890";
     long c;
     c=atol(a)+atol(b);
     printf("c=%d\n",c);
     return 0;
}

运行结果:
c=1234567890


     (4)gcvt(将浮点型数转换为字符串,取四舍五入)
相关函数 ecvt,fcvt,sprintf
表头文件 #include<stdlib.h>
定义函数 char *gcvt(double number,size_t ndigits,char *buf);
函数说明 gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示
     显示的位数。gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所
     转换后的字符串包含小数点或正负符号。若转换成功,转换后的字
     符串会放在参数buf指针所指的空间。
返回值 返回一字符串指针,此地址即为buf指针。
附加说明
范例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
     double a=123.45;
     double b=-1234.56;
     char *ptr;
     int decpt,sign;
     gcvt(a,5,ptr);
     printf("a value=%s\n",ptr);
     ptr=gcvt(b,6,ptr);
     printf("b value=%s\n",ptr);
     return 0;
}

运行结果:

     a value=123.45
     b value=-1234.56


     (5)strtod(将字符串转换成浮点数)
相关函数 atoi,atol,strtod,strtol,strtoul
表头文件 #include<stdlib.h>
定义函数 double strtod(const char *nptr,char **endptr);
函数说明 strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上
     数字或正负符号才开始做转换,到出现非数字或字符串结束时
     ('/0')才结束转换,并将结果返回。若endptr不为NULL,则会将遇
     到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字
     符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或
     123e-2。
返回值 返回转换后的浮点型数。
附加说明 参考atof()。
范例 /*将字符串转换成浮点数*/

#include <stdlib.h>
#include <stdio.h>
 int main()
 {
     char a[]="1000000000";
     char b[]="1000000000";
     char c[]="ffff";
     printf("a=%d\n",strtod(a,NULL));
     printf("b=%d\n",strtod(b,NULL));
     printf("c=%d\n",strtod(c,NULL));
     return 0;
}

运行结果:

a=10

b=10

c=540655273


     (6)strtol(将字符串转换成长整型数)
相关函数 atof,atoi,atol,strtod,strtoul

表头文件 #include<stdlib.h>
定义函数 long int strtol(const char *nptr,char **endptr,int base);
函数说明 strtol()会将参数nptr字符串根据参数base来转换成长整型数。参
     数base范围从2至36,或0。参数base代表采用的进制方式,如base
     值为10则采用10进制,若base值为16则采用16进制等。当base值为0
     时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制
     做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格
     字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字
     符串结束时('/0')结束转换,并将结果返回。若参数endptr不为
     NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返
     回。
返回值 返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno
     中。
附加说明 ERANGE指定的转换字符串超出合法范围。
范例 /* 将字符串a,b,c 分别采用10,2,16进制转换成数字*/

#include <stdlib.h>
#include <stdio.h>
 int main()
 {
     char a[]="1000000000";
     char b[]="1000000000";
     char c[]="ffff";
     printf("a=%d\n",strtol(a,NULL,10));
     printf("b=%d\n",strtol(b,NULL,2));
     printf("c=%d\n",strtol(c,NULL,16));
     return 0;
}

运行结果:

a=1000000000

b=512

c=65535


     (7)strtoul(将字符串转换成无符号长整型数)
相关函数 atof,atoi,atol,strtod,strtol

表头文件 #include<stdlib.h>
定义函数 unsigned long int strtoul(const char *nptr,char
     **endptr,int base);

函数说明 strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整
     型数。参数base范围从2至36,或0。参数base代表采用的进制方
     式,如base值为10则采用10进制,若base值为16则采用16进制数
     等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符
     则会使用16进制做转换。一开始strtoul()会扫描参数nptr字符串,
     跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,
     再遇到非数字或字符串结束时('/0')结束转换,并将结果返回。若
     参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符
     指针由endptr返回。
返回值 返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno
     中。
附加说明 ERANGE指定的转换字符串超出合法范围。
范例: 参考strtol()


     (8)toascii(将整型数转换成合法的ASCII 码字符)
相关函数 isascii,toupper,tolower

表头文件 #include<ctype.h>
定义函数 int toascii(int c)
函数说明 toascii()会将参数c转换成7位的unsigned char值,第八位则会被
     清除,此字符即会被转成ASCII码字符。
返回值 将转换成功的ASCII码字符值返回。
范例:

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
 int main()
 {
     int a=217;
     char b;
     printf("before toascii () : a value =%d(%c)\n",a,a);
     b=toascii(a);
     printf("after toascii() : a value =%d(%c)\n",b,b);
     return 0;
}

运行结果:

before toascii () : a value =217(?)

after toascii() : a value =89(Y)


     (9)tolower(将大写字母转换成小写字母)
相关函数 isalpha,toupper
表头文件 #include<stdlib.h>
定义函数 int tolower(int c);
函数说明 若参数c为大写字母则将该对应的小写字母返回。
返回值 返回转换后的小写字母,若不须转换则将参数c值返回。
附加说明
范例 /* 将s字符串内的大写字母转换成小写字母*/

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
 int main()
 {
     char s[]="aBcDeFgH12345;!#$";
     int i;
     printf("before tolower() : %s\n",s);
     for(i=0;i<sizeof(s);i++)
         s[i]=tolower(s[i]);
     printf("after tolower() : %s\n",s);
     return 0;
}

运行结果:

before tolower() : aBcDeFgH12345;!#$

after tolower() : abcdefgh12345;!#$


     (10)toupper(将小写字母转换成大写字母)
相关函数 isalpha,tolower
表头文件 #include<ctype.h>
定义函数 int toupper(int c);
函数说明 若参数c为小写字母则将该对映的大写字母返回。
返回值 返回转换后的大写字母,若不须转换则将参数c值返回。
附加说明
范例: /* 将s字符串内的小写字母转换成大写字母*/

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
 int main()
 {
     char s[]="aBcDeFgH12345;!#$";
     int i;
     printf("before toupper() : %s\n",s);
     for(i=0;i<sizeof(s);i++)
         s[i]=toupper(s[i]);
     printf("after toupper() : %s\n",s);
     return 0;
}

运行结果:

before toupper() : aBcDeFgH12345;!#$

after toupper() : ABCDEFGH12345;!#$


字符串操作,编程语言中永恒的主题!

apollo-减速带通行 主车在通过减速带时速度不超过3m/s 阅读详情

相关推荐

Marin说PCB之LPDDR5的布线注意事项--01

以上就是本期所有内容了,有些是通用的LPDDR5的设计准则,有的是针对单板的设计规则,严格意义说是没有哪一种规则是完全适用的LPDDR5的 通用规则的,不同的单板可能板厚,板材,层数,SOC以及DDR的型号都是不同的,一般的做法就是严格按照SOC手册上的LPDDR5的要求加上仿真同事给的建议修改优化就好了,我们下期文章不见不散。我们知道想要做好一个LPDDR颗粒,需要考虑的是因素有很多例如,电源完整性,信号完整性,层叠的设计,布局的摆放,布线的合理规划,去耦电容的摆放等等。

weixin_45223454的博客 3163

c-常用的字符串转换函数

这学期开设了数据结构,各种实验。 也涉及了一些之前学习中没有涉及的函数。 学习之余,写篇博客mark下。主要是c语言一些常用的字符串转换函数 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数) strtoul(将字符串转换成无符号长整型数)

Colin丶 2572

机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下)

摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。

bother3000的博客 3329

c++ 字符串拼接_C语言快速入门——使用安全版本的字符串函数

我们已经学习了使用char*来存储一个常量字符串,更多的时候我们需要的是操作字符串以完成所需。C语言提供了很多字符串操作函数,在此我们学习一些常用的操作。strcpy:拷贝字符串strcpy(目标字符串, 源字符串);把源字符串拷贝到目标字符串。作为程序员,我们要负责保证目标字符串的存储空间能包容源字符串。strcmp:比较字符串strcmp(字符串1, 字符串2);按当前的编码规则比较两个字符串...

weixin_39725873的博客 540

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流

本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。

weixin_29246195的博客 580

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3791

【C语言学习笔记(一)】ASCII码转字符

一、要求 提示输入一个ASCII码值(如,66),然后打印输入的字符。 二、程序 使用printf()函数进行强制转换。 三、结果

Backlight__的博客 1万+

RK3568驱动 SPI主/从 配置

RK3568 SPI 配置指南 内核配置:启用用户空间驱动(主)和从模式协议支持。 主模式:设备树设置status="okay"、max-freq及引脚复用,子节点compatible="rockchip,spidev"。 从模式:需添加spi-slave属性,子节点命名以slave@X开头。 编译烧写:修改设备树后编译内核或全量镜像,验证/dev/spidevX.Y节点。 测试:使用spidev_test工具,主模式可环回测试,从模式需与主设备通信。 (关键:从模式强制spi-slave和命名规则,频率匹

文石_2009的博客 1146

C语言-字符转ASCII码

输入描述: 一行,一个字符。 输出描述: 一行,输出输入字符对应的ASCII码。 示例1 输入: c 输出: 99 #include <stdio.h> int main() { char x='c'; scanf("%c",&x); printf("%d",x); return 0; } ...

m0_63372226的博客 2万+

Android UI 组件系列(二):Button 进阶用法

在这篇博客中,我们深入探讨了 Button 的进阶用法,重点介绍了如何通过 事件处理 来响应用户的操作,如何使用 自定义样式 来提升按钮的外观,并利用 StateListDrawable 来管理按钮在不同状态下的表现。这些技巧能够帮助你打造更具交互性、视觉吸引力和动态响应的按钮,提升用户体验。

weixin_39339407的博客 1625

NXP S32k3 MCAL ADC配置

S32K3 配置MCAL ADC

Leon_0125的博客 5072

C语言字符串转换ASCII

字符串转换ASCII。

阿狸的博客 1万+

2020计算机专业保研夏令营面经:中科院计算所网数机试题目

计算所网络数据科学与技术重点实验室的第一阶段是机试。机试不限程序语言,要求提交源代码。

乔卿的博客 2957

ascll码 — c语言转换

字符 0 是ascll码里的第一位,字符 1 是ascll码里的第二位。大写字母A~Z对应的ASCII码(十进制)为“65”~“90”以此类推,从48位在ascll码中加一就代表,字符的数字增加一。数字0~9对应的ASCII码(十进制)为“48”~“57”也就是说,我们数字0,想变成字符0,只需要加48就好了。好我们理解原理之后我们去看, '0'这个值不就是48吗。注意,'0'的ascll码是48,'1'是49。我们数字也一样,加48就变成了字符1。3+'0'='3'不就成了吗。

Henry_Mo_Fang的博客 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c语言——字符转ASCLL码

字符转ASCLL码

weixin_66547608的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言中的ASCII的转换

ASCII码与字符的转换

m0_64694898的博客 3056

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

c语言入门将ASCII码和字符相互转换及其思考

#include&lt;stdio.h&gt; void main() { unsigned char a; printf("enter char:"); scanf("%C",&amp; a ); printf("ascii = %d", a );//强制转化为ascii码 } 同理; #include&lt;stdio.h&gt; void main() { unsigned ch...

viafcccy的博客 9万+

C语言toascii()函数:把一个字符转换为ASCII

把一个字符转换为ASCII,其实就是把八位二进制的最高变成0。: 把一个非ASCII字符转换为ASCII字符。: int ch 待转换的字符。: 返回转换后的字符。

guoruibin123的博客 1656

c语言 字符转换成ascii吗,C语言字符转换ASCII码

//函数名:CharToHex()//功能描述:把ASCII字符转换为16进制//函数说明://调用函数://全局变量://输入:ASCII字符//返回:16进制/////////////////////////////////////////////////////////////////////unsignedcharCharToHex(unsignedcharbH...

weixin_30140399的博客 1万+

【C语言】atoi和atof函数的使用

这期给大家带来两个函数,分别是atoi、atof,虽然我们不常用,但大家还是需要掌握,毕竟艺高人胆大

Become Mad的博客 7114

C 库函数 - atof()

1.包含头文件#include <stdlib.h> 2.介绍: 描述 C 库函数 double atof(const char *str) 把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。 声明 下面是 atof() 函数的声明。 double atof(const char *str) 参数 str – 要转换为浮点数的字符串。 返回值 函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。 3.使用示例 ...

FairLikeSnow的博客 447

C语言转化编码格式(UTF8转GB2312)

【代码】C语言转化编码格式(UTF8转GB2312)

qq_37377257的博客 1555

C语言:字母大小写转换

1.方法一:用ASCII字符码。2.方法二:利用库函数。#鹏哥C语言#P76。

m0_73751096的博客 295

C语言中atof函数和isdigit函数的使用

atof()是C++和C语言中的字符串转化函数,用于将字符串转换为double类型的浮点数。 isdigit函数是C++和C语言中的字符处理函数,用于判断一个字符是否是数字。

qq_68780730的博客 1571

c 语言实现 atof() 函数

c 语言实现 atof 函数1. atof() 函数介绍浮点数的合法表达形式测试自带 atof() 函数2. 实现 atof() 函数功能 1. atof() 函数介绍 C 库函数 *double atof(const char str) 属于库函数 stdlib.h,把参数 str 所指向的字符串转换为一个浮点数。 具体操作为: 跳过字符串开始的空白符,识别数字,点好,或正负符号,开始扫描合法浮...

ALWAYS LEARNING 5766

C语言 atof()的实现

atof()的实现,实现了与c自带函数的相同效果

wutao1530663的博客 4170
上一篇: JNI编写详细步骤实践,javac编译,gcc编译
下一篇: C语言字符串函数大全,字符串复制strcpy,字符串比较strcmp,字符串连接strcat,strstr,strncpy,strerror...
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值