当前位置: 首页 > news >正文

分析strtol(),strtoul()和strtod()三个函数的功能

字符串转换为数值部分和子字符串首地址的函数有strtol(),strtoul()和strtod()三个函数。

1、strtol()函数

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

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制转换

//当base=0时,若字符串是以"0"开头,则将数字部分按照8进制进制转换

//当base=0时,若字符串是以"0x"和"0X"开头,则将数字部分按照16进制进转换

//当base=10时,字符串将字符串视为十进制字符串,则将数字部分按照10进制转换

//当base=2时,字符串将字符串视为2进制字符串,则将数字部分按照2进制转换

//当base=16时,字符串将字符串视为16进制字符串,则将数字部分按照16进制转换

//当base=8时,字符串将字符串视为8进制字符串,则将数字部分按照8进制转换

void Test_strtol(void)

{

char buf[15];//声明char型数组buf[]

int retValue;//声明int型变量(有符号32位)

char *p;//声明char型数组SubStringBuf[]

strcpy(buf,"+10GHIJ");

retValue=strtol(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=10,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=10

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"-1EFGH");

retValue=strtol(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=-1,p指向"EFGH"

printf("Value=%d\r\n",retValue);//串口输出Value=-1

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=EFGH"

else printf("No SubString\r\n");

strcpy(buf,"0x10GHIJ");

retValue=strtol(buf,&p,0);

//当base=0时,若字符串以"0x"或"0X"开头,则将其视为十六进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=0x10,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=16

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"010GHIJ");

retValue=strtol(buf,&p,0);

//当base=0时,若字符串以"0"开头,则将其视为八进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=8,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=8

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtol(buf,&p,10);

//当base=10时,字符串将字符串视为十进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=10,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=10

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtol(buf,&p,2);

//当base=2时,字符串将字符串视为二进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=2,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=2

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtol(buf,&p,16);

//当base=2时,字符串将字符串视为16进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=16,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=16

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtol(buf,&p,8);

//当base=2时,字符串将字符串视为8进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=8,p指向"GHIJ"

printf("Value=%d\r\n",retValue);//串口输出Value=8

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

retValue=0;

}

2、strtoul()函数

unsigned long int strtoul(const char *str, char **endptr, int base)

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制转换

//当base=0时,若字符串是以"0"开头,则将数字部分按照8进制进制转换

//当base=0时,若字符串是以"0x"和"0X"开头,则将数字部分按照16进制进转换

//当base=10时,字符串将字符串视为十进制字符串,则将数字部分按照10进制转换

//当base=2时,字符串将字符串视为2进制字符串,则将数字部分按照2进制转换

//当base=16时,字符串将字符串视为16进制字符串,则将数字部分按照16进制转换

//当base=8时,字符串将字符串视为8进制字符串,则将数字部分按照8进制转换

#include "string.h" //strcpy()需要包含string.h头文件

#include "stdlib.h" //strtol()和strtoul()需要包含stdlib.h头文件

void Test_strtoul(void)

{

char buf[15];//声明char型数组buf[]

uint32_t retValue;//声明uint32_t型变量(有符号32位)

char *p;//声明char型数组SubStringBuf[]

strcpy(buf,"+10GHIJ");

retValue=strtoul(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=10,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=10

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"-1EFGH");

retValue=strtoul(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=-1,p指向"EFGH"

printf("Value=%u\r\n",retValue);//串口输出Value=-1

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=EFGH"

else printf("No SubString\r\n");

strcpy(buf,"0x10GHIJ");

retValue=strtoul(buf,&p,0);

//当base=0时,若字符串以"0x"或"0X"开头,则将其视为十六进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=0x10,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=16

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"010GHIJ");

retValue=strtoul(buf,&p,0);

//当base=0时,若字符串以"0"开头,则将其视为八进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=8,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=8

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtoul(buf,&p,10);

//当base=10时,字符串将字符串视为十进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=10,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=10

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtoul(buf,&p,2);

//当base=2时,字符串将字符串视为二进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=2,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=2

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtoul(buf,&p,16);

//当base=2时,字符串将字符串视为16进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=16,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=16

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"10GHIJ");

retValue=strtoul(buf,&p,8);

//当base=2时,字符串将字符串视为8进制字符串

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=8,p指向"GHIJ"

printf("Value=%u\r\n",retValue);//串口输出Value=8

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

retValue=0;

}

测试strtol()和strtoul()不同之处

当将“保存的返回值retValue”声明uint32_t型变量(无符号32位)时,strtoul()和strtol()功能有点点区别,当“字符串的数字部分小于0”时,strtoul()的值为0x100000000+负数,例如字符串“-1”,它会返回retValue=0x100000000-1=0xFFFFFFFF=4294967295。当“字符串的数字部分大于0x7FFFFFFF”时,strtol()的返回值为负数”,例如字符串“0xFFFFFFFF”,它会返回retValue=0xFFFFFFFF=-1

#include "string.h" //strcpy()需要包含string.h头文件

#include "stdlib.h" //strtol()和strtoul()需要包含stdlib.h头文件

void Test_strtol_strtoul(void)

{

char buf[15];//声明char型数组buf[]

int retValue1;//声明int型变量(有符号32位)

uint32_t retValue2;//声明uint32_t型变量(无符号32位)

char *p;//声明char型指针p

strcpy(buf,"4294967295EFGH");

retValue1=strtol(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue1=0x7FFFFFFF,p指向"EFGH"

printf("Value=%d\r\n",retValue1);//串口输出Value=2147483647

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=EFGH"

else printf("No SubString\r\n");

strcpy(buf,"4294967295EFGH");

retValue2=strtoul(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue2=4294967295,p指向"EFGH"

printf("Value=%u\r\n",retValue2);//串口输出Value=4294967295

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=EFGH"

else printf("No SubString\r\n");

strcpy(buf,"-1EFGH");

retValue1=strtol(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue1=-1,p指向"EFGH"

printf("Value=%d\r\n",retValue1);//串口输出Value=-1

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=EFGH"

else printf("No SubString\r\n");

strcpy(buf,"-1EFGH");

retValue2=strtoul(buf,&p,0);

//当base=0时,若字符串不是以"0","0x"和"0X"开头,则将其视为十进制

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue2=0x100000000-1=4294967295,p指向"EFGH"

printf("Value=%u\r\n",retValue2);//串口输出Value=4294967295

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=EFGH"

else printf("No SubString\r\n");

retValue2=0;

}

3、strtod()函数

double strtod(const char *str, char **endptr);

//将"字符串的数字部分"转换为数值返回,同时将"非数字部分的首地址"返回,保存到endptr

void Test_strtod(void)

{

char buf[15];//声明char型数组buf[]

double retValue;//声明double型变量(64位)

char *p;//声明char型数组SubStringBuf[]

strcpy(buf,"+10.5GHIJ");

retValue=strtod(buf,&p);

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=10.5,p指向"GHIJ"

printf("Value=%0.1f\r\n",retValue);//串口输出Value=10.5

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

strcpy(buf,"-10.5GHIJ");

retValue=strtod(buf,&p);

//将"字符串的数字部分"转换为数值返回,保存到retValue中

//同时将"非数字部分的首地址"返回,保存到p

//retValue=-10.5,p指向"GHIJ"

printf("Value=%0.1f\r\n",retValue);//串口输出Value=-10.5

if(p)printf("SubString=%s\r\n",p);//串口输出"SubString=GHIJ"

else printf("No SubString\r\n");

retValue=0;

}

相关文章:

  • 从网页到桌面:将 Web 应用无缝迁移为 Electron 桌面程序
  • 电赛经验分享——模块篇
  • 定积分的定义式(黎曼和极限定义)
  • 协议(消息)生成
  • STA中的multi_cycle 和false_path详细讨论
  • 从Rtos到Linux:学习的策略
  • Dify框架面试内容整理-如何评估基于Dify开发的AI应用的效果?
  • 【Vue】Vue3源码解析与实现原理
  • 基于muduo库实现高并发服务器
  • Linux文件复制命令精要指南:cp与scp详解
  • DotNetBrowser 3.2.0 版本发布啦!
  • RPC是什么
  • 线程局部存储----TLS
  • 使用AI 将文本转成视频 工具 介绍
  • 《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》
  • zotero pdf中英翻译插件使用
  • 10 种最新的思维链(Chain-of-Thought, CoT)增强方法
  • 星途-(4)
  • docker 外部能访问外网,内部不行(代理问题)
  • SpringCloud GateWay网关
  • 印官员称巴基斯坦在克什米尔实控线附近开火已致7死38伤
  • 李云泽:小微企业融资协调工作机制已发放贷款12.6万亿元
  • 上海虹桥高铁站拦门事件反转,谁在带偏网友?
  • 《中国医药指南》就“宫颈癌等论文出现男性病例”致歉:辞退涉事编辑
  • 《蓦然回首》:现代动画的践行与寓言
  • 马克思主义理论研究教学名师系列访谈|金瑶梅:教师需要了解学生的现实发展,把握其思想发展动态