当前位置: 首页 > 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;

}

http://www.xdnf.cn/news/290305.html

相关文章:

  • 字符串哈希专题
  • 架构进阶:什么是数据架构,如何理解数据架构?(华为)
  • 从0开始学习大模型--Day01--大模型是什么
  • 什么是开放数据湖(Open Data Lake)?
  • 十大排序算法全面解析(Java实现)及优化策略
  • Kotlin 作用域函数全解析:let、run、with、apply、also 应该怎么选?
  • C++演讲比赛案例代码
  • [人机交互]理解与概念化交互
  • 小工具功能强大,非常优秀!​
  • 「Mac畅玩AIGC与多模态20」开发篇16 - 使用结构化输出字段控制后续流程示例
  • 基于STM32F103C8T6驱动WS2812彩灯模块点亮RGB灯
  • 布隆过滤器
  • Qt学习笔记
  • SVD降维详解
  • 领略算法真谛: 多源bfs
  • 设一个测试情境,新用户注册后显示的名字不完整,测试思路是怎么样的?
  • 项目实战-基于信号处理与SVM机器学习的声音情感识别系统
  • 【Bootstrap V4系列】学习入门教程之 组件-按钮组(Button group)
  • MAC地址与帧结构
  • ICLR2024 | GNS-HFA | 通过梯度归一化缩放和高频适应增强视觉Transformer的可迁移对抗攻击
  • WMS仓库管理系统:Java+Vue,含源码及文档,集成仓储全流程管控,实现库存精准、作业高效、数据透明
  • Visual Studio 项目转Qt项目
  • 用网页显示工控仪表
  • Barrett Reduction算法优化:更紧的界限消除冗余的减法
  • 迅睿CMS导入别站数据库
  • 【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列
  • 卡尔曼滤波详解
  • 从Excel到高级工具:数据分析进阶指南
  • # 部署深度学习模型:Flask API 服务端与客户端通信实战
  • Linux进程间的通信