字符串转换为数值部分和子字符串首地址的函数有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;
}